Django集成CAS单点登录完整指南:服务端搭建与客户端配置
本文详细讲解如何在Django项目中集成CAS单点登录。通过搭建基于django-mama-cas的CAS服务端,并配置django-cas-ng客户端,实现前后端分离架构下的SSO认证。内容涵盖服务端安装、用户创建、客户端settings配置及路由映射,解决域名白名单、跨域限制等常见问题,提供完整的调试步骤与代码示例。
CAS单点登录原理与流程
CAS(Central Authentication Service,集中式认证服务)是一种广泛采用的实现单点登录(SSO)的技术方案。
CAS的标准通讯流程如下图所示(图片源自Google图库):
从用户视角来看,整个认证过程包含以下关键步骤:
- 前端发起请求访问后端的登录接口。
- 后端接收请求后,返回重定向指令至CAS服务器登录页,同时携带当前用户试图访问的目标网页链接。
- 用户在CAS页面完成登录,浏览器向CAS服务器发送认证请求。
- CAS验证通过后,将登录状态保存至会话,并向后端返回回调地址。
- 后端接收到回调信息后,向前端返回重定向请求。
- 前端根据重定向指令,跳转回用户登录前的原始页面。
在此过程中,TGT(Ticket Granting Ticket)的处理逻辑已由开源项目python-cas封装实现,开发者无需手动处理。
需要注意的是,CAS服务端通常配置有安全过滤条件,如域名白名单。因此,在接入新系统时,务必将新系统的域名或IP地址添加到CAS服务端的配置列表中。
出于安全考量,CAS通常不支持跨域访问,这可能导致前后端分离开发时遇到一些麻烦(虽有解决方案,但本文未涉及具体尝试)。
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
在INSTALLED_APPS配置项中添加'mama_cas'应用:
具体配置在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',
],
},
]
配置完成后即可使用。
# 使用任意端口都可,此处我使用 30000
python manage.py runserver 0.0.0.0:30000
服务启动后,访问http://0.0.0.0:30000/login即可进入CAS登录页面。
此时会出现一个问题:用户名和密码是什么?
经过一番摸索,发现django-mama-cas默认使用django.auth模块中的User类,通过执行django-admin命令创建超级用户,该用户即可用于登录CAS:
python manage.py createsuperuser
输入用户名和密码即可完成超级用户创建,随后使用该用户登录即可。
Django客户端集成与调试
接下来配置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'),
]
最后进行调试。
启动当前Django服务:
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本身的逻辑需要一定时间,但作为成熟的单点登录架构,通常都有开源客户端实现。代码量不大,多调试并参考文档进行配置即可顺利集成。
参考资料。
https://github.com/jbittel/django-mama-cas https://django-mama-cas.readthedocs.io/en/latest/ https://github.com/mingchen/django-cas-ng
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













