Skip to content

Commit 8230099

Browse files
committed
Fixes #5442: Use LDAP groups to find permissions
When AUTH_LDAP_FIND_GROUP_PERMS is set to true the filter to find the users permissions is extended to search for all permissions assigned to groups in which the LDAP user is.
1 parent ec5ed17 commit 8230099

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

netbox/netbox/authentication.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from utilities.permissions import permission_is_exempt, resolve_permission, resolve_permission_ct
1212

1313

14-
class ObjectPermissionBackend(ModelBackend):
14+
class ObjectPermissionMixin():
1515

1616
def get_all_permissions(self, user_obj, obj=None):
1717
if not user_obj.is_active or user_obj.is_anonymous:
@@ -20,13 +20,16 @@ def get_all_permissions(self, user_obj, obj=None):
2020
user_obj._object_perm_cache = self.get_object_permissions(user_obj)
2121
return user_obj._object_perm_cache
2222

23+
def get_permission_filter(self, user_obj):
24+
return Q(users=user_obj) | Q(groups__user=user_obj)
25+
2326
def get_object_permissions(self, user_obj):
2427
"""
2528
Return all permissions granted to the user by an ObjectPermission.
2629
"""
2730
# Retrieve all assigned and enabled ObjectPermissions
2831
object_permissions = ObjectPermission.objects.filter(
29-
Q(users=user_obj) | Q(groups__user=user_obj),
32+
self.get_permission_filter(user_obj),
3033
enabled=True
3134
).prefetch_related('object_types')
3235

@@ -86,6 +89,10 @@ def has_perm(self, user_obj, perm, obj=None):
8689
return model.objects.filter(constraints, pk=obj.pk).exists()
8790

8891

92+
class ObjectPermissionBackend(ObjectPermissionMixin, ModelBackend):
93+
pass
94+
95+
8996
class RemoteUserBackend(_RemoteUserBackend):
9097
"""
9198
Custom implementation of Django's RemoteUserBackend which provides configuration hooks for basic customization.
@@ -163,8 +170,15 @@ def __new__(cls, *args, **kwargs):
163170
"Required parameter AUTH_LDAP_SERVER_URI is missing from ldap_config.py."
164171
)
165172

166-
# Create a new instance of django-auth-ldap's LDAPBackend
167-
obj = LDAPBackend_()
173+
# Create a new instance of django-auth-ldap's LDAPBackend with our own ObjectPermissions
174+
class NBLDAPBackend(ObjectPermissionMixin, LDAPBackend_):
175+
def get_permission_filter(self, user_obj):
176+
permission_filter = Q(users=user_obj) | Q(groups__user=user_obj)
177+
if self.settings.FIND_GROUP_PERMS:
178+
permission_filter = permission_filter | Q(groups__name__in=user_obj.ldap_user.group_names)
179+
return permission_filter
180+
181+
obj = NBLDAPBackend()
168182

169183
# Read LDAP configuration parameters from ldap_config.py instead of settings.py
170184
settings = LDAPSettings()

0 commit comments

Comments
 (0)