diff --git a/aleksis/core/migrations/0023_add_permissions_person.py b/aleksis/core/migrations/0023_add_permissions_person.py
index 7b4ffb22f4f290b96ade618336808c0f25c08be2..2f73d8d5e7d450ea0afca7ba836a3ee08088a0bf 100644
--- a/aleksis/core/migrations/0023_add_permissions_person.py
+++ b/aleksis/core/migrations/0023_add_permissions_person.py
@@ -12,6 +12,6 @@ class Migration(migrations.Migration):
     operations = [
         migrations.AlterModelOptions(
             name='person',
-            options={'ordering': ['last_name', 'first_name'], 'permissions': (('view_address', 'Can view address'), ('view_contact_details', 'Can view contact details'), ('view_photo', 'Can view photo'), ('view_person_groups', 'Can view persons groups')), 'verbose_name': 'Person', 'verbose_name_plural': 'Persons'},
+            options={'ordering': ['last_name', 'first_name'], 'permissions': (('view_address', 'Can view address'), ('view_contact_details', 'Can view contact details'), ('view_photo', 'Can view photo'), ('view_personal_details', 'Can view personal details'), ('view_person_groups', 'Can view persons groups')), 'verbose_name': 'Person', 'verbose_name_plural': 'Persons'},
         ),
     ]
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index b13cd66278cc9aa0910e6a0b791169676e250530..0ea49774c79d08bcd15d8635fec71b3831e99cdd 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -100,6 +100,7 @@ class Person(ExtensibleModel):
             ("view_contact_details", _("Can view contact details")),
             ("view_photo", _("Can view photo")),
             ("view_person_groups", _("Can view persons groups")),
+            ("view_personal_details", _("Can view personal details")),
         )
 
     icon_ = "person"
diff --git a/aleksis/core/rules.py b/aleksis/core/rules.py
index ef6740807a1d05ad6b886d7d1f661866e7d4f987..234d6f80159442633f3e45fbc753fe7ad39de6c4 100644
--- a/aleksis/core/rules.py
+++ b/aleksis/core/rules.py
@@ -131,3 +131,9 @@ add_perm("core.view_people_menu", has_person & (view_persons_predicate | view_gr
 # View admin menu
 view_admin_menu_predicate = has_person & (manage_data_predicate | manage_school_predicate | impersonate_predicate | view_system_status_predicate | view_announcements_predicate)
 add_perm("core.view_admin_menu", view_admin_menu_predicate)
+
+# View person personal details
+view_personal_details_predicate = has_person & (
+    has_global_perm("core.view_personal_details") | has_object_perm("core.view_personal_details") | is_current_person
+)
+add_perm("core.view_personal_details", view_personal_details_predicate)
diff --git a/aleksis/core/templates/core/person_full.html b/aleksis/core/templates/core/person_full.html
index d018cc15bac07a8e74df41298dff20358f2107e9..cf584d8ae87e203936c1c077a6a4345c06661cb9 100644
--- a/aleksis/core/templates/core/person_full.html
+++ b/aleksis/core/templates/core/person_full.html
@@ -77,12 +77,15 @@
             <td colspan="3">{{ person.email }}</td>
           </tr>
         {% endif %}
-        <tr>
-          <td>
-            <i class="material-icons small">cake</i>
-          </td>
-          <td colspan="3">{{ person.date_of_birth|date }}</td>
-        </tr>
+        {% has_perm 'core.view_personal_details' user person as can_view_personal_details %}
+        {% if can_view_personal_details %}
+          <tr>
+            <td>
+              <i class="material-icons small">cake</i>
+            </td>
+            <td colspan="3">{{ person.date_of_birth|date }}</td>
+          </tr>
+        {% endif %}
       </table>
     </div>
   </div>