diff --git a/netbox/netbox/admin.py b/netbox/netbox/admin.py index 27a033094..ba923c6ca 100644 --- a/netbox/netbox/admin.py +++ b/netbox/netbox/admin.py @@ -2,6 +2,16 @@ from django.conf import settings from django.contrib.admin import AdminSite from django.contrib.auth.admin import GroupAdmin, UserAdmin from django.contrib.auth.models import Group, User +from django.contrib.sites.admin import SiteAdmin +from django.contrib.sites.models import Site +from allauth.socialaccount.admin import ( + SocialApp, + SocialAppAdmin, + SocialAccount, + SocialAccountAdmin, + SocialToken, + SocialTokenAdmin, +) class NetBoxAdminSite(AdminSite): @@ -18,6 +28,12 @@ admin_site = NetBoxAdminSite(name='admin') # Register external models admin_site.register(Group, GroupAdmin) admin_site.register(User, UserAdmin) +admin_site.register(Site, SiteAdmin) + +# Register allauth models +admin_site.register(SocialApp, SocialAppAdmin) +admin_site.register(SocialAccount, SocialAccountAdmin) +admin_site.register(SocialToken, SocialTokenAdmin) # Modify the template to include an RQ link if django_rq is installed (see RQ_SHOW_ADMIN_LINK) if settings.WEBHOOKS_ENABLED: diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index b9dd61253..7609a3975 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -160,9 +160,14 @@ INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', + 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.humanize', + 'allauth', + 'allauth.account', + 'allauth.socialaccount', + 'allauth.socialaccount.providers.github', 'cacheops', 'corsheaders', 'debug_toolbar', @@ -234,6 +239,8 @@ TEMPLATES = [ # Authentication AUTHENTICATION_BACKENDS = [ 'utilities.auth_backends.ViewExemptModelBackend', + 'django.contrib.auth.backends.ModelBackend', + 'allauth.account.auth_backends.AuthenticationBackend', ] # Internationalization @@ -391,6 +398,19 @@ FILTERS_NULL_CHOICE_LABEL = 'None' FILTERS_NULL_CHOICE_VALUE = 'null' +# +# Django Site +# + +SITE_ID = 1 + +# +# Django Allauth +# + +ACCOUNT_DEFAULT_HTTP_PROTOCOL='https' +LOGIN_REDIRECT_URL = 'home' + # # Django REST framework (API) # diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index c7b97a686..af5b55e2e 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -31,6 +31,9 @@ _patterns = [ path(r'login/', LoginView.as_view(), name='login'), path(r'logout/', LogoutView.as_view(), name='logout'), + # AllAuth + path(r'accounts/', include('allauth.urls')), + # Apps path(r'circuits/', include('circuits.urls')), path(r'dcim/', include('dcim.urls')), diff --git a/netbox/templates/extras/provider_list.html b/netbox/templates/extras/provider_list.html new file mode 100644 index 000000000..625b14910 --- /dev/null +++ b/netbox/templates/extras/provider_list.html @@ -0,0 +1,20 @@ +{% load socialaccount %} + +{% get_providers as socialaccount_providers %} + +{% for provider in socialaccount_providers %} + {% if provider.id == "openid" %} + {% for brand in provider.get_brands %} +
  • + + Log in with {{ brand.name }} + +
  • + {% endfor %} + {% endif %} +
  • + + Log in with {{ provider.name }} + +
  • +{% endfor %} diff --git a/netbox/templates/login.html b/netbox/templates/login.html index e3d22399e..7f3cca545 100644 --- a/netbox/templates/login.html +++ b/netbox/templates/login.html @@ -1,5 +1,7 @@ {% extends '_base.html' %} {% load form_helpers %} +{% load account socialaccount %} + {% block content %}
    @@ -23,6 +25,14 @@ Log In
    + {% get_providers as socialaccount_providers %} + {% if socialaccount_providers %} +
    + +
    + {% endif %} {% csrf_token %} {% if 'next' in request.GET %}{% endif %} {% if 'next' in request.POST %}{% endif %} diff --git a/netbox/templates/users/_user.html b/netbox/templates/users/_user.html index 9f71b9633..40a019eab 100644 --- a/netbox/templates/users/_user.html +++ b/netbox/templates/users/_user.html @@ -23,8 +23,8 @@
    -
    +
    {% block usercontent %}{% endblock %} -
    +
    {% endblock %} diff --git a/netbox/utilities/middleware.py b/netbox/utilities/middleware.py index 360fb29fc..8ca2f0fdb 100644 --- a/netbox/utilities/middleware.py +++ b/netbox/utilities/middleware.py @@ -22,7 +22,7 @@ class LoginRequiredMiddleware(object): # Redirect unauthenticated requests to the login page. API requests are exempt from redirection as the API # performs its own authentication. Also metrics can be read without login. api_path = reverse('api-root') - if not request.path_info.startswith((api_path, '/metrics')) and request.path_info != settings.LOGIN_URL: + if not request.path_info.startswith((api_path, '/metrics', '/accounts')) and request.path_info != settings.LOGIN_URL: return HttpResponseRedirect( '{}?next={}'.format( settings.LOGIN_URL, diff --git a/requirements.txt b/requirements.txt index 3ad165a4b..622d19532 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ Django>=2.2,<2.3 +django-allauth==0.39.1 django-cacheops==4.1 django-cors-headers==3.0.2 django-debug-toolbar==2.0