基于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迭代器和生成器介绍
Mar 06 Python
Python中将字典转换为列表的方法
Sep 21 Python
Python双向循环链表实现方法分析
Jul 30 Python
分享Python切分字符串的一个不错方法
Dec 14 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
用python写测试数据文件过程解析
Sep 25 Python
pandas中遍历dataframe的每一个元素的实现
Oct 23 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
Python tkinter 下拉日历控件代码
Mar 04 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
用python对excel进行操作(读,写,修改)
Dec 25 Python
Python实现对word文档添加密码去除密码的示例代码
Dec 29 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操作SVN版本服务器类代码
2011/11/27 PHP
利用php获取服务器时间的实现代码
2013/06/07 PHP
php比较相似字符串的方法
2015/06/05 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
jquery 查找新建元素代码
2010/07/06 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
详解Python中for循环的使用
2015/04/14 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
Python Django搭建网站流程图解
2020/06/13 Python
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
哪些情况下不应该使用索引
2015/07/20 面试题
银行实习生自我鉴定范文
2013/09/19 职场文书
产品质量保证书
2014/04/29 职场文书
说明书范文
2014/05/07 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
黄埔军校观后感
2015/06/10 职场文书
新闻通讯稿范文
2015/07/22 职场文书
详解python字符串驻留技术
2021/05/21 Python
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis