I’ve posted a couple of times before about using a Central Authentication Service with Django. As I update my applications to Django v1.5, it is time to revisit the subject.
In my Django v1.3 setup, the django-cas library has served me well. However, in this later version of the framework, there are changes that break the library. The maintainer of django-cas has not yet updated their code to work with 1.5 (although there are pull requests waiting that address the issue – stay tuned).
Luckily, another educational institution has forked the library. Our friends at Kansas State University (Go Wildcats!) have released their maintained version of django-cas on github. They have fixed the issue with the get_host()
call, plus added some proxy features. Note that the fix is in a branch and not yet in a released version – currently at v0.8.5. I have installed it in my first app to be converted, and it works fine.
Installation
As far as I can tell, this K-State fork is not hosted on PyPi at this time, so I use this line in my requirements file to get the library via pip:
svn+https://github.com/kstateome/django-cas/branches/bugfix/django_1_5
This uses Subversion because that is what is available on the servers, but the git syntax will work just as well.
Configuration
K-State has provided only minimal documentation, but they link back to the original CCPC installation guide. Below are my settings.py
and urls.py
code. (Note that USE_CAS
is a variable I define that is set True or False based on the environment.)
## django_cas settings
if USE_CAS:
CAS_SERVER_URL = '### your server URL here ###'
CAS_VERSION = '2'
CAS_LOGOUT_COMPLETELY = True
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'cas.backends.CASBackend',
)
MIDDLEWARE_CLASSES += (
'cas.middleware.CASMiddleware',
)
## end django_cas settings
# django_cas urls
if settings.USE_CAS:
urlpatterns = patterns('',
('^admin/logout/$', RedirectView.as_view(url='../../accounts/logout')), ## TODO: This could be better
('^admin/password_change/$',RedirectView.as_view(url='### URL to your password change service ###')),
url(r'^accounts/login/$', 'cas.views.login',name='login'),
url(r'^accounts/logout/$', 'cas.views.logout',name='logout'),
) + urlpatterns
else:
urlpatterns = patterns('',
url(r'^accounts/login/$', 'django.contrib.auth.views.login',{'template_name': 'login.html'},name='login'),
) + urlpatterns
# end django_cas urls
Biggest change is that the package name changed from django-cas
to cas
.
Best of luck with your CAS setup!