From d470eb85537433b9feca177e02cdda0adfd25d27 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Fri, 3 Feb 2012 00:26:56 +0100 Subject: [PATCH] Adds group requirements --- main/decorators.py | 16 ++++++++++++++++ main/templates/registration/login.html | 10 ++++++++++ main/urls.py | 9 ++++++--- main/views.py | 5 +++++ settings-sample.py | 8 ++++---- 5 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 main/decorators.py diff --git a/main/decorators.py b/main/decorators.py new file mode 100644 index 0000000..7a985a8 --- /dev/null +++ b/main/decorators.py @@ -0,0 +1,16 @@ +from django.conf import settings +from django.contrib.auth.decorators import user_passes_test + +def groups_required(*group_names): + """Requires user membership in at least one of the groups passed in.""" + def in_groups(u): + if u.is_authenticated(): + if bool(u.groups.filter(name__in=group_names)) | u.is_superuser: + return True + # Gi brukeren beskjed (muligens) + message = "Jeg kan ikke gi deg tilgang fordi \ + du er ikke i noen av disse gruppene: {0}.".format( + ", ".join(settings.GROUPS_ALLOWED)) + u.message_set.create(message=message) + return False + return user_passes_test(in_groups) diff --git a/main/templates/registration/login.html b/main/templates/registration/login.html index 877ebfb..d662202 100644 --- a/main/templates/registration/login.html +++ b/main/templates/registration/login.html @@ -2,6 +2,16 @@ {% block content %} +{% if messages %} +
+
+ {% for message in messages %} +
{{ message }}
+ {% endfor %} +
+
+{% endif %} + {% include "registration/login_form.html" %} {% endblock %} diff --git a/main/urls.py b/main/urls.py index 282f098..c755b8f 100644 --- a/main/urls.py +++ b/main/urls.py @@ -1,22 +1,25 @@ from datetime import datetime from django.conf.urls.defaults import patterns, include, url -from django.views.generic.list_detail import object_list # FIXME: subclass? +from django.views.generic.list_detail import object_list from django.contrib.auth.decorators import login_required +from django.conf import settings from models import * +from decorators import groups_required + urlpatterns = patterns('main.views', url(r'^system/$', 'system', name='system'), url(r'^new/$', 'new', name='new'), url(r'^new/created/$', 'new_created', name='new_created'), url(r'^list/page(?P[0-9]+)/$', - login_required(object_list), { + groups_required(settings.GROUPS_ALLOWED)(login_required(object_list)), { 'queryset': TempUserLog.objects.filter(expires__gt=datetime.now()).order_by('created').reverse(), 'template_name':'private/list.html' }, name='list_page'), url(r'^list/', - login_required(object_list), { + groups_required(settings.GROUPS_ALLOWED)(login_required(object_list)), { 'queryset': TempUserLog.objects.filter(expires__gt=datetime.now()).order_by('created').reverse(), 'template_name':'private/list.html' }, diff --git a/main/views.py b/main/views.py index a3f47de..94039a7 100644 --- a/main/views.py +++ b/main/views.py @@ -20,6 +20,7 @@ from models import * from radius.models import * from forms import * import utils +from decorators import groups_required from pdf import render_to_pdf @@ -37,6 +38,7 @@ def index(request): return render_to_response('public/index.html', locals(), context_instance=RequestContext(request)) +@groups_required(settings.GROUPS_ALLOWED) @login_required def new(request): if request.method == "POST": @@ -74,6 +76,7 @@ def new(request): return render_to_response('private/new.html', locals(), context_instance=RequestContext(request)) +@groups_required(settings.GROUPS_ALLOWED) @login_required def new_created(request): # Retrieve the last id from session @@ -85,11 +88,13 @@ def new_created(request): tempuserlog_id = 0 return render_to_response('private/new_created.html', locals(), context_instance=RequestContext(request)) +@groups_required(settings.GROUPS_ALLOWED) @login_required def system(request): return render_to_response('private/system.html', locals(), context_instance=RequestContext(request)) +@groups_required(settings.GROUPS_ALLOWED) @login_required def download_pdf(request, tempuserlog_id=-1): log = get_object_or_404(TempUserLog, pk=tempuserlog_id) diff --git a/settings-sample.py b/settings-sample.py index e495c86..c90ef15 100755 --- a/settings-sample.py +++ b/settings-sample.py @@ -172,10 +172,8 @@ AUTH_LDAP_USER_FLAGS_BY_GROUP = { "is_staff": "cn=edb,ou=Groups,dc=neuf,dc=no", "is_superuser": "cn=edbadmin,ou=Groups,dc=neuf,dc=no" } -AUTH_LDAP_REQUIRE_GROUP = LDAPSearch( - "ou=Groups,dc=neuf,dc=no", - ldap.SCOPE_ONELEVEL, - "(|(cn=dns-styret)(cn=dns-admin)(cn=dns-billettluka)(cn=edb))") +#AUTH_LDAP_REQUIRE_GROUP = "cn=edb,ou=Groups,dc=neuf,dc=no" + # Group to profile flag mappings, not used. AUTH_LDAP_PROFILE_FLAGS_BY_GROUP = { #"is_edb": "cn=edb,ou=Groups,dc=neuf,dc=no" @@ -224,3 +222,5 @@ LOGGING = { } LOGIN_REDIRECT_URL = '/system/' +# List of required groups to use MBFTNS (enforced per view) +GROUPS_ALLOWED = ['dns-admin','edb','dns-billettluka','dns-styret']