基于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进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
python实现外卖信息管理系统
Jan 11 Python
完美解决安装完tensorflow后pip无法使用的问题
Jun 11 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
pytorch 输出中间层特征的实例
Aug 17 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
Python数据分析之绘图和可视化详解
Jun 02 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
php数据库密码的找回的步骤
2011/01/12 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
Prototype Template对象 学习
2009/07/19 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
Javascript实现的Map集合工具类完整实例
2015/07/31 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
JS中实现函数return多个返回值的实例
2017/02/21 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
酒店节能减排方案
2014/05/26 职场文书
乌镇导游词
2015/02/02 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
2016年母亲节广告语
2016/01/28 职场文书
《颐和园》教学反思
2016/02/19 职场文书
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers