Django集成CAS单点登录完整指南:服务端搭建与客户端配置

阿澈
阿澈
发布时间:2026-10-13| 6人浏览过
原创

本文详细讲解如何在Django项目中集成CAS单点登录。通过搭建基于django-mama-cas的CAS服务端,并配置django-cas-ng客户端,实现前后端分离架构下的SSO认证。内容涵盖服务端安装、用户创建、客户端settings配置及路由映射,解决域名白名单、跨域限制等常见问题,提供完整的调试步骤与代码示例。

CAS单点登录原理与流程

CAS(Central Authentication Service,集中式认证服务)是一种广泛采用的实现单点登录(SSO)的技术方案。

CAS的标准通讯流程如下图所示(图片源自Google图库):

从用户视角来看,整个认证过程包含以下关键步骤:

  1. 前端发起请求访问后端的登录接口。
  2. 后端接收请求后,返回重定向指令至CAS服务器登录页,同时携带当前用户试图访问的目标网页链接。
  3. 用户在CAS页面完成登录,浏览器向CAS服务器发送认证请求。
  4. CAS验证通过后,将登录状态保存至会话,并向后端返回回调地址。
  5. 后端接收到回调信息后,向前端返回重定向请求。
  6. 前端根据重定向指令,跳转回用户登录前的原始页面。

在此过程中,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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。