基于Django集成CAS实现流程详解


Posted in Python onNovember 28, 2020

前言

单点登录(Single Sign On,SSO)是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
有多种开源的单点登录方案,其中,CAS(Central Authentication Service)是Yale University开发的、应用比较广泛的一种实现。

CAS概述

CAS 全称集中式认证服务(Central Authentication Service),是实现单点登录(SSO)的一种手段。

对于本文用户可感知的层面,认证过程如下:

  • 前端访问后端登录接口
  • 后端返回重定向到 CAS 服务器的登录页面,并携带当前用户访问的网页链接
  • 用户登录,浏览器发送请求到 CAS 服务器进行认证
  • CAS 认证通过,将本次登录保存到会话,返回回调地址给后端
  • 后端返回重定向请求给前端
  • 前端重定向到跳转登录前的页面
  • 中间涉及到的 TGT 处理逻辑已经由开源 CAS Client(python-cas) 实现。
  • 要注意,CAS 服务器本身有一些过滤条件,例如域名白名单等,因此接入的时候需要将新系统的域名或 IP 加入 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

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 :

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 本身逻辑需要理解,但是毕竟是成熟的单点登录架构,一般都存在开源的客户端实现,代码量不多,多调试多参考文档配置即可。

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

Python 相关文章推荐
Python MD5文件生成码
Jan 12 Python
Python urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
python类和函数中使用静态变量的方法
May 09 Python
Python批量转换文件编码格式
May 17 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
实例讲解Python中函数的调用与定义
Mar 14 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
python 随机森林算法及其优化详解
Jul 11 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
Feb 18 Python
如何在scrapy中集成selenium爬取网页的方法
Nov 18 Python
Django haystack实现全文搜索代码示例
Nov 28 #Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 #Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 #Python
Python self用法详解
Nov 28 #Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 #Python
python安装sklearn模块的方法详解
Nov 28 #Python
Django-silk性能测试工具安装及使用解析
Nov 28 #Python
You might like
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
对js关键字命名的疑问介绍
2014/04/25 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
Python操作MySQL数据库的方法
2018/06/20 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
Python requests上传文件实现步骤
2020/09/15 Python
python 实现单例模式的5种方法
2020/09/23 Python
python从Oracle读取数据生成图表
2020/10/14 Python
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
艺术应用与设计专业个人的自我评价
2013/11/19 职场文书
化妆品店促销方案
2014/02/24 职场文书
年会主持词结束语
2014/03/27 职场文书
班委竞选演讲稿
2014/04/28 职场文书
公司募捐倡议书
2014/05/14 职场文书
服务承诺书格式
2014/05/21 职场文书
门卫管理制度范本
2015/08/05 职场文书
公司周年庆寄语
2019/06/21 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
解决Oracle数据库用户密码过期
2022/05/11 Oracle