diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py
index 26ec4f9323bcbc33e8cbba54ae016a35e614b912..f4d6a8956a81d2413a21d010b0792610da3feaf5 100644
--- a/aleksis/apps/alsijil/menus.py
+++ b/aleksis/apps/alsijil/menus.py
@@ -18,7 +18,12 @@ MENUS = {
                     "url": "select_coursebook",
                     "svg_icon": "mdi:book-education-outline",
                     "vuetify_icon": "mdi-book-education-outline",
-                    # FIXME: Permissions
+                    "validators": [
+                        (
+                            "aleksis.core.util.predicates.permission_validator",
+                            "alsijil.view_coursebook_rule",
+                        ),
+                    ]
                 },
                 {
                     "name": _("Current lesson"),
diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py
index e9011c6c2b33ed58a21b6412f6c7e366b1b5e49e..83af497c900ea9ed54df5d3f8e4f7b63828d2ebe 100644
--- a/aleksis/apps/alsijil/rules.py
+++ b/aleksis/apps/alsijil/rules.py
@@ -204,6 +204,11 @@ view_students_list_predicate = view_my_groups_predicate & (
 )
 add_perm("alsijil.view_students_list_rule", view_students_list_predicate)
 
+# View CourseBook
+view_coursebook_predicate = has_person & is_teacher
+add_perm("alsijil.view_coursebook_rule", view_my_students_predicate)
+
+
 # View person overview
 view_person_overview_predicate = has_person & (
     (is_current_person & is_site_preference_set("alsijil", "view_own_personal_notes"))
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index 3a24d1df67c87f220e17b0b7e3dd619b8e82690d..57ea6b8352b546d4d677beb73ec4efb85eb8a33a 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -25,7 +25,7 @@ from django_tables2 import RequestConfig, SingleTableView
 from guardian.core import ObjectPermissionChecker
 from guardian.shortcuts import get_objects_for_user
 from reversion.views import RevisionMixin
-from rules.contrib.views import PermissionRequiredMixin, permission_required, LoginRequiredMixin
+from rules.contrib.views import PermissionRequiredMixin, permission_required
 
 from aleksis.apps.chronos.managers import TimetableType
 from aleksis.apps.chronos.models import (
@@ -1358,19 +1358,19 @@ class AllRegisterObjectsView(PermissionRequiredMixin, View):
         return render(request, "alsijil/class_register/all_objects.html", context)
 
 
-class CoursebookView(LoginRequiredMixin, DetailView):
+class CoursebookView(PermissionRequiredMixin, DetailView):
     model = Lesson
     template_name = "alsijil/class_register/coursebook.html"
-    permission_required = ""  # FIXME
+    permission_required = "alsijil.view_coursebook_rule"
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         return context
 
 
-class SelectCoursebookView(LoginRequiredMixin, TemplateView):
+class SelectCoursebookView(PermissionRequiredMixin, TemplateView):
     template_name = "alsijil/class_register/select_coursebook.html"
-    permission_required = ""  # FIXME
+    permission_required = "alsijil.view_coursebook_rule"  # FIXME
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)