plug SAML
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Thu, 6 Sep 2012 18:05:51 +0000 (14:05 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Thu, 6 Sep 2012 18:05:51 +0000 (14:05 -0400)
buildout.cfg
project/rh/test/common.py
project/settings.py
project/templates/actions.html
project/templates/index.html
project/urls.py
project/views.py
versions.cfg

index 759c76f..c36a14c 100644 (file)
@@ -9,6 +9,7 @@ parts = django
 find-links = http://pypi.auf.org/simple/auf.recipe.django/
     http://pypi.auf.org/simple/auf.django.skin/
     http://pypi.auf.org/simple/auf.django.auth/
+    http://pypi.auf.org/simple/auf.django.saml/
     http://pypi.auf.org/simple/auf.django.workflow/
     http://pypi.auf.org/simple/auf.django.admingroup/
     http://pypi.auf.org/simple/auf.django.permissions/
@@ -16,8 +17,10 @@ find-links = http://pypi.auf.org/simple/auf.recipe.django/
     http://pypi.auf.org/simple/auf.django.references/
     http://pypi.auf.org/simple/django-alphafilter/
     http://pypi.auf.org/simple/odsgen/
+
 develop = src/qbe
     src/auf.django.metadata
+
 eggs =
     django
     south
@@ -35,6 +38,7 @@ eggs =
     django-urldecorators
     auf.django.admingroup
     auf.django.auth
+    auf.django.saml
     auf.django.emploi
     auf.django.metadata
     auf.django.permissions
index fb238c3..643229e 100644 (file)
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import datetime
+from auf.django.saml.settings import SAML_REDIRECT_FIELD_NAME
 from django.contrib.auth.models import User, Group
 from project import groups
 from auf.django.references import models as ref
@@ -284,7 +285,9 @@ class RhTest(TestCase):
 
     def _test_acces_ko(self, url):
         response = self.client.get(url, follow=True)
-        is_ko = response.status_code in (403, 404) or 'next' in response.context
+        is_ko = response.status_code in (403, 404) or \
+                'next' in response.context or \
+                SAML_REDIRECT_FIELD_NAME in response.context['request'].GET.keys()
         self.assertEqual(is_ko, True)
 
     def _test_anonyme(self):
index df61367..61e44f9 100644 (file)
@@ -24,15 +24,18 @@ DATE_INPUT_FORMATS = ('%d-%m-%Y', )
 SESSION_SAVE_EVERY_REQUEST = True
 SESSION_EXPIRE_AT_BROWSER_CLOSE = True
 
+PROJECT_ROOT = os.path.dirname(__file__)
+SITE_ROOT = os.path.dirname(PROJECT_ROOT)
+
 # Absolute path to the directory that holds media.
 # Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'media')
-PRIVE_MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'media_prive')
+MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
+PRIVE_MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media_prive')
 
 STATICFILES_DIRS = (
-    os.path.join(os.path.dirname(__file__), 'assets'),
+    os.path.join(PROJECT_ROOT, 'assets'),
 )
-STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'static')
+STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
 STATIC_URL = '/static/'
 
 # URL that handles the media served from MEDIA_ROOT. Make sure to use a
@@ -55,6 +58,7 @@ MIDDLEWARE_CLASSES = (
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'auf.django.saml.middleware.SPMiddleware',
     'django.middleware.doc.XViewMiddleware',
     'reversion.middleware.RevisionMiddleware',
 )
@@ -69,6 +73,7 @@ INSTALLED_APPS = (
     'auf.django.workflow',
     'auf.django.permissions',
     'auf.django.emploi',
+    'auf.django.saml',
     'admin_tools',
     'admin_tools.theming',
     'admin_tools.menu',
@@ -107,11 +112,9 @@ TEMPLATE_CONTEXT_PROCESSORS = (
 )
 
 AUTHENTICATION_BACKENDS = (
-    'auf.django.auth.backends.CascadeBackend',
+    'auf.django.saml.backends.SPBackend',
     'auf.django.permissions.backends.AuthenticationBackend',
 )
-LOGIN_URL = "/connexion"
-LOGIN_REDIRECT_URL = "/"
 
 TEMPLATE_DIRS = (
     os.path.join(os.path.dirname(__file__), "templates"),
index cdc8f6d..2729fff 100644 (file)
@@ -1,11 +1,11 @@
+{% load saml %}
+
 <ul>
     {% if user.is_authenticated %}
-      <li class="username">{{ user }}</li>
+    <li class="username"><img src="{{ STATIC_URL }}/img/idauf_16.png" /> {{ user }}</li>
       {% if perms.recrutement or user_in_dae_groupes or perms.rh %}
         <li><a href="{% url admin:index %}">Administration</a></li>
       {% endif %}
-      <li><a href="{% url django.contrib.auth.views.logout %}?next=/">Déconnexion</a></li>
-    {% else %}
-      <li><a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Connexion</a></li>
+      <li><a href="{% mellon_logout_url %}">Déconnexion</a></li>
     {% endif %}
 </ul>
index 856a8b0..519d264 100644 (file)
@@ -6,31 +6,23 @@
 
 {% block main %}
 
-{% if not request.user.is_authenticated %}
-<h1>Connexion</h1>
+{% for k,v in meta.items %}
+<p>{{ k }} : {{ v }}</p>
+{% endfor %}
 
-    <form method="post" action="{% url django.contrib.auth.views.login %}">{% csrf_token %}
-        <table>
-        {{ form.as_table }}
-        </table>
-        <input type="submit" value="Se connecter" />
-        <input type="hidden" name="next" value="{{ next }}" />
-    </form>
+<h1>Vos droits d'accès</h1>
+{% if request.user.groups.all %}
+  <p>Vous faîtes partie des groupes suivants : </p>
+  <ul>
+      {% for g in request.user.groups.all %}
+      <li>{{ g.name }}</li>
+      {% endfor %}
+  </ul>
 {% else %}
-    <h1>Vos droits d'accès</h1>
-    {% if request.user.groups.all %}
-      <p>Vous faîtes partie des groupes suivants : </p>
-      <ul>
-          {% for g in request.user.groups.all %}
-          <li>{{ g.name }}</li>
-          {% endfor %}
-      </ul>
-    {% else %}
-      <p>
-      Vous n'avez actuellement aucun droit dans ce système.<br />
-      Contactez la DRH si vous croyez qu'il s'agit d'une erreur.
-      </p>
-    {% endif %}
+  <p>
+  Vous n'avez actuellement aucun droit dans ce système.<br />
+  Contactez la DRH si vous croyez qu'il s'agit d'une erreur.
+  </p>
 {% endif %}
 
 {% endblock %}
index 5334386..dd06a52 100644 (file)
@@ -4,6 +4,7 @@ from django.contrib import admin
 from urldecorators.defaults import patterns, include, url
 from urldecorators.defaults import handler500  # NOQA
 from auf.django import permissions
+from auf.django.saml import settings as saml_settings
 from project.monkey import patch_ajax_selects
 
 patch_ajax_selects()
@@ -13,28 +14,43 @@ permissions.autodiscover()
 
 urlpatterns = patterns(
     '',
-    url(r'^$', 'project.views.index', name='index'),
-    url(r'^admin_tools/', include('admin_tools.urls')),
+    url(r'^$', 'project.views.index', name='index',
+        decorators=['auf.django.saml.decorators.login_required']),
+
+    url(r'^', include('auf.django.saml.urls')),
+
+    url(r'^admin_tools/', include('admin_tools.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
     (r'^admin/', include(admin.site.urls)),
+
     url(r'^api/(?P<method>[a-z_-]+)/(?P<offre_id>\d+)/$',
         'project.recrutement.api.api', name='recrutement_api'),
     url(r'^api/(?P<method>[a-z_-]+)/$', 'project.recrutement.api.api',
         name='recrutement_api'),
-    (r'^connexion/$', 'django.contrib.auth.views.login'),
-    (r'^deconnexion/$', 'django.contrib.auth.views.logout'),
-    #url(r'^private_files/', include('private_files.urls')),
-    url(r'^captcha/', include('captcha.urls')),
-    (r'^ajax_select/', include('ajax_select.urls')),
-    (r'^tinymce/', include('tinymce.urls')),
-    url(r'^prive/(?P<filename>.*)$', 'project.views.piece'),
+
+    url(r'^captcha/', include('captcha.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
+    url(r'^ajax_select/', include('ajax_select.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
+    url(r'^tinymce/', include('tinymce.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
+    url(r'^prive/(?P<filename>.*)$', 'project.views.piece',
+        decorators=['auf.django.saml.decorators.login_required']),
 
     # apps
     url(r'^dae/', include('project.dae.urls'),
-        decorators=['django.contrib.auth.decorators.login_required']),
+        decorators=['auf.django.saml.decorators.login_required']),
     url(r'^recrutement/', include('project.recrutement.urls'),
-        decorators=['django.contrib.auth.decorators.login_required']),
+        decorators=['auf.django.saml.decorators.login_required']),
     url(r'^rh/', include('project.rh.urls'),
-        decorators=['django.contrib.auth.decorators.login_required']),
+        decorators=['auf.django.saml.decorators.login_required']),
 
-    url(r'^qbe/', include('django_qbe.urls')),
+    url(r'^qbe/', include('django_qbe.urls'),
+        decorators=['auf.django.saml.decorators.login_required']),
 )
+
+if not saml_settings.SAML_AUTH:
+    urlpatterns += patterns(
+        '',
+        (r'^', include('auf.django.saml.mellon_urls')),
+    )
index 7466549..fd83264 100644 (file)
@@ -4,8 +4,8 @@ import os
 from sendfile import sendfile
 
 from django.conf import settings
+from django.shortcuts import render
 from django.contrib.auth.decorators import login_required
-from django.contrib.auth.views import login
 from django.http import Http404
 
 from project.decorators import redirect_interdiction
@@ -13,8 +13,10 @@ from project.rh import models as rh_models
 from project.dae import models as dae_models
 
 
+@login_required
 def index(request):
-    return login(request, template_name='index.html')
+    c = {}
+    return render(request, 'index.html', c)
 
 
 @login_required
index 267c447..5831745 100644 (file)
@@ -71,3 +71,6 @@ auf.recipe.django = 2.1
 
 # Added by Buildout Versions at 2012-08-23 09:21:24.235070
 raven = 2.0.4
+
+# Added by Buildout Versions at 2012-09-06 10:52:35.715101
+auf.django.saml = 1.6