Skip to content

Commit cc0c985

Browse files
jschewebbnlarsks
andauthored
Feature/remote group autocreate (#12394)
* Add REMOTE_AUTH_AUTOCREATE_GROUPS When REMOTE_AUTH_AUTOCREATE_GROUPS is True, Netbox will create groups referenced in the REMOTE_AUTH_GROUP_HEADER that don't exist in the database. Closes #7671 * Fix naming of parameter Apply the fix requested by kkthxbye-code in #8603 --------- Co-authored-by: Lars Kellogg-Stedman <[email protected]>
1 parent 4eb5e90 commit cc0c985

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

netbox/netbox/authentication.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,11 @@ def configure_groups(self, user, remote_groups):
156156
try:
157157
group_list.append(Group.objects.get(name=name))
158158
except Group.DoesNotExist:
159-
logging.error(
160-
f"Could not assign group {name} to remotely-authenticated user {user}: Group not found")
159+
if settings.REMOTE_AUTH_AUTO_CREATE_GROUPS:
160+
group_list.append(Group.objects.create(name=name))
161+
else:
162+
logging.error(
163+
f"Could not assign group {name} to remotely-authenticated user {user}: Group not found")
161164
if group_list:
162165
user.groups.set(group_list)
163166
logger.debug(

netbox/netbox/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
QUEUE_MAPPINGS = getattr(configuration, 'QUEUE_MAPPINGS', {})
123123
RELEASE_CHECK_URL = getattr(configuration, 'RELEASE_CHECK_URL', None)
124124
REMOTE_AUTH_AUTO_CREATE_USER = getattr(configuration, 'REMOTE_AUTH_AUTO_CREATE_USER', False)
125+
REMOTE_AUTH_AUTO_CREATE_GROUPS = getattr(configuration, 'REMOTE_AUTH_AUTO_CREATE_GROUPS', False)
125126
REMOTE_AUTH_BACKEND = getattr(configuration, 'REMOTE_AUTH_BACKEND', 'netbox.authentication.RemoteUserBackend')
126127
REMOTE_AUTH_DEFAULT_GROUPS = getattr(configuration, 'REMOTE_AUTH_DEFAULT_GROUPS', [])
127128
REMOTE_AUTH_DEFAULT_PERMISSIONS = getattr(configuration, 'REMOTE_AUTH_DEFAULT_PERMISSIONS', {})

netbox/netbox/tests/test_authentication.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,50 @@ def test_remote_auth_remote_groups_default(self):
310310
list(new_user.groups.all())
311311
)
312312

313+
@override_settings(
314+
REMOTE_AUTH_ENABLED=True,
315+
REMOTE_AUTH_AUTO_CREATE_USER=True,
316+
REMOTE_AUTH_GROUP_SYNC_ENABLED=True,
317+
REMOTE_AUTH_AUTO_CREATE_GROUPS=True,
318+
LOGIN_REQUIRED=True,
319+
)
320+
def test_remote_auth_remote_groups_autocreate(self):
321+
"""
322+
Test enabling remote authentication with group sync and autocreate
323+
enabled with the default configuration.
324+
"""
325+
headers = {
326+
"HTTP_REMOTE_USER": "remoteuser2",
327+
"HTTP_REMOTE_USER_GROUP": "Group 1|Group 2",
328+
}
329+
330+
self.assertTrue(settings.REMOTE_AUTH_ENABLED)
331+
self.assertTrue(settings.REMOTE_AUTH_AUTO_CREATE_USER)
332+
self.assertTrue(settings.REMOTE_AUTH_AUTO_CREATE_GROUPS)
333+
self.assertTrue(settings.REMOTE_AUTH_GROUP_SYNC_ENABLED)
334+
self.assertEqual(settings.REMOTE_AUTH_HEADER, "HTTP_REMOTE_USER")
335+
self.assertEqual(settings.REMOTE_AUTH_GROUP_HEADER, "HTTP_REMOTE_USER_GROUP")
336+
self.assertEqual(settings.REMOTE_AUTH_GROUP_SEPARATOR, "|")
337+
338+
groups = (
339+
Group(name="Group 1"),
340+
Group(name="Group 2"),
341+
)
342+
343+
response = self.client.get(reverse("home"), follow=True, **headers)
344+
self.assertEqual(response.status_code, 200)
345+
346+
new_user = User.objects.get(username="remoteuser2")
347+
self.assertEqual(
348+
int(self.client.session.get("_auth_user_id")),
349+
new_user.pk,
350+
msg="Authentication failed",
351+
)
352+
self.assertListEqual(
353+
[group.name for group in groups],
354+
[group.name for group in list(new_user.groups.all())],
355+
)
356+
313357
@override_settings(
314358
REMOTE_AUTH_ENABLED=True,
315359
REMOTE_AUTH_AUTO_CREATE_USER=True,

0 commit comments

Comments
 (0)