Skip to content

Commit cc5d48c

Browse files
committed
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
1 parent 3ee3c52 commit cc5d48c

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
@@ -113,8 +113,11 @@ def configure_groups(self, user, remote_groups):
113113
try:
114114
group_list.append(Group.objects.get(name=name))
115115
except Group.DoesNotExist:
116-
logging.error(
117-
f"Could not assign group {name} to remotely-authenticated user {user}: Group not found")
116+
if settings.REMOTE_AUTH_AUTO_CREATE_GROUPS:
117+
group_list.append(Group.objects.create(name=name))
118+
else:
119+
logging.error(
120+
f"Could not assign group {name} to remotely-authenticated user {user}: Group not found")
118121
if group_list:
119122
user.groups.set(group_list)
120123
logger.debug(

netbox/netbox/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
PLUGINS_CONFIG = getattr(configuration, 'PLUGINS_CONFIG', {})
103103
RELEASE_CHECK_URL = getattr(configuration, 'RELEASE_CHECK_URL', None)
104104
REMOTE_AUTH_AUTO_CREATE_USER = getattr(configuration, 'REMOTE_AUTH_AUTO_CREATE_USER', False)
105+
REMOTE_AUTH_AUTO_CREATE_GROUP = getattr(configuration, 'REMOTE_AUTH_AUTO_CREATE_GROUP', False)
105106
REMOTE_AUTH_BACKEND = getattr(configuration, 'REMOTE_AUTH_BACKEND', 'netbox.authentication.RemoteUserBackend')
106107
REMOTE_AUTH_DEFAULT_GROUPS = getattr(configuration, 'REMOTE_AUTH_DEFAULT_GROUPS', [])
107108
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
@@ -218,6 +218,50 @@ def test_remote_auth_remote_groups_default(self):
218218
list(new_user.groups.all())
219219
)
220220

221+
@override_settings(
222+
REMOTE_AUTH_ENABLED=True,
223+
REMOTE_AUTH_AUTO_CREATE_USER=True,
224+
REMOTE_AUTH_GROUP_SYNC_ENABLED=True,
225+
REMOTE_AUTH_AUTO_CREATE_GROUPS=True,
226+
LOGIN_REQUIRED=True,
227+
)
228+
def test_remote_auth_remote_groups_autocreate(self):
229+
"""
230+
Test enabling remote authentication with group sync and autocreate
231+
enabled with the default configuration.
232+
"""
233+
headers = {
234+
"HTTP_REMOTE_USER": "remoteuser2",
235+
"HTTP_REMOTE_USER_GROUP": "Group 1|Group 2",
236+
}
237+
238+
self.assertTrue(settings.REMOTE_AUTH_ENABLED)
239+
self.assertTrue(settings.REMOTE_AUTH_AUTO_CREATE_USER)
240+
self.assertTrue(settings.REMOTE_AUTH_AUTO_CREATE_GROUPS)
241+
self.assertTrue(settings.REMOTE_AUTH_GROUP_SYNC_ENABLED)
242+
self.assertEqual(settings.REMOTE_AUTH_HEADER, "HTTP_REMOTE_USER")
243+
self.assertEqual(settings.REMOTE_AUTH_GROUP_HEADER, "HTTP_REMOTE_USER_GROUP")
244+
self.assertEqual(settings.REMOTE_AUTH_GROUP_SEPARATOR, "|")
245+
246+
groups = (
247+
Group(name="Group 1"),
248+
Group(name="Group 2"),
249+
)
250+
251+
response = self.client.get(reverse("home"), follow=True, **headers)
252+
self.assertEqual(response.status_code, 200)
253+
254+
new_user = User.objects.get(username="remoteuser2")
255+
self.assertEqual(
256+
int(self.client.session.get("_auth_user_id")),
257+
new_user.pk,
258+
msg="Authentication failed",
259+
)
260+
self.assertListEqual(
261+
[group.name for group in groups],
262+
[group.name for group in list(new_user.groups.all())],
263+
)
264+
221265
@override_settings(
222266
REMOTE_AUTH_ENABLED=True,
223267
REMOTE_AUTH_AUTO_CREATE_USER=True,

0 commit comments

Comments
 (0)