Django集成CAS实现单点登录完整指南
本文详细讲解如何在Django项目中集成CAS实现单点登录。通过部署django-mama-cas作为服务端,并使用django-cas-ng作为客户端,配置相关参数即可完成认证流程。文章涵盖从环境搭建、代码配置到调试验证的全过程,帮助开发者快速落地SSO方案。
前言
CAS单点登录概述
单点登录(Single Sign On,SSO)允许用户在多个相互信任的应用系统中仅需一次登录即可访问所有系统。在众多开源SSO方案中,由耶鲁大学开发的CAS(Central Authentication Service)因其广泛应用而备受青睐。
CAS概述
CAS,即集中式认证服务,是实现单点登录的核心机制之一。
从用户视角来看,整个认证流程大致如下:
- 前端向后端发起登录接口请求。
- 后端响应并重定向至CAS服务器的登录页面,同时携带当前用户原本欲访问的网页链接作为服务地址。
- 用户在CAS服务器页面完成登录,浏览器向CAS服务器发送认证请求。
- CAS验证通过后,将登录状态保存至会话,并将回调地址返回给后端应用。
- 后端接收到回调信息后,向前端发送重定向请求。
- 前端根据重定向指令,跳转回用户登录前的原始页面。
- 在此过程中,TGT(Ticket Granting Ticket)的处理逻辑已由开源的CAS客户端库(如python-cas)封装实现。
- 需要注意的是,CAS服务器通常设有安全过滤条件,例如域名白名单机制。因此,在接入新系统时,务必将新系统的域名或IP地址添加到CAS服务端的配置中。
Django集成CAS服务端配置
接入 CAS
鉴于初次接触CAS,为了便于调试,我在本地环境中直接启动了一个CAS服务端实例。
CAS客户端则集成在实际开发的Django代码中。
CAS 服务端配置
GitHub上存在多个CAS项目,我选择了一个基于Django框架的django-mama-cas应用进行部署。
创建 django-cas-server 项目:
django-admin startproject django-cas-server
安装 django-mama-cas 依赖:
pip install django-mama-cas
在 settings.py 中添加 'mama_cas' 应用:
settings.py
settings.py
INSTALLED_APPS = [
...
'mama_cas',
]
添加 mama_cas 应用中的路由:
urls.py
urlpatterns += [url(r'', include('mama_cas.urls'))]
配置 CAS 信息:
MAMA_CAS_SERVICES = [
{
# 必填项,此项为**Client** IP:Port,相当于白名单
'SERVICE': 'http://127.0.0.1:8000',
# 回调模式,具体参考官方文档
'CALLBACKS': [
'mama_cas.callbacks.user_model_attributes',
],
},
]
使用
python manage.py runserver 0.0.0.0:9000
服务启动后,访问 http://0.0.0.0:9000/login 即可进入CAS登录页面。
django-mama-cas 默认使用 django.auth 模块中的 User 模型。通过 django-admin 创建的超级用户,同样可用于登录CAS。
Django集成CAS客户端配置
CAS 客户端
Python提供了开源的CAS客户端python-cas。由于后端采用Django开发,我直接选用了封装了python-cas的Django应用django-cas-ng。
先安装依赖:
pip install django-cas-ng
在 settings.py 中的 INSTALLED_APPS 和 AUTHENTICATION_BACKENDS 两处添加 django-cas-ng 的配置:
settings.py
INSTALLED_APPS = (
# ... other installed apps
'django_cas_ng',
)
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'django_cas_ng.backends.CASBackend',
)
同时参考准备接入的 CAS 地址和版本,添加几个对应的配置:
# CAS 的地址 CAS_SERVER_URL = 'http://127.0.0.1:30000' # CAS 版本 CAS_VERSION = '3' # 存入所有 CAS 服务端返回的 User 数据。 CAS_APPLY_ATTRIBUTES_TO_USER = True
添加登入登出的路由(这两部分逻辑已由 django-cas-ng 完成,可以直接使用。如果需要扩展,可以参照源码自己实现即可):
urls.py
import django_cas_ng.views as cas_views
urlpatterns = [
...
path('login/', django_cas_ng.views.LoginView.as_view(), name='cas_ng_login'),
path('logout/', django_cas_ng.views.LogoutView.as_view(), name='cas_ng_logout'),
]
调试与验证
调试
启动当前服务:
python manage.py runserver
访问 http://127.0.0.1:8000/login ,网页将会跳转到 http://127.0.0.1:30000/login?service=http://127.0.0.1:8000 CAS 登录页面(注意端口不同),登录成功后将会跳转回来。
总结
虽然需要理解CAS的基本逻辑,但作为成熟的单点登录架构,通常已有开源客户端实现。代码量不大,通过多调试和参考文档配置即可顺利接入。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









