基于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传递中文参数的问题
Aug 04 Python
flask入门之文件上传与邮件发送示例
Jul 18 Python
python实现遍历文件夹修改文件后缀
Aug 28 Python
详解Django的CSRF认证实现
Oct 09 Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
pytorch forward两个参数实例
Jan 17 Python
python实现井字棋小游戏
Mar 04 Python
Python DES加密实现原理及实例解析
Jul 17 Python
详解python3 GUI刷屏器(附源码)
Feb 18 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 Python
手把手教你怎么用Python实现zip文件密码的破解
May 27 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 广告调用类代码(支持Flash调用)
2011/08/11 PHP
教大家制作简单的php日历
2015/11/17 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
utf8的编码算法 转载
2006/12/27 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
详解python如何在django中为用户模型添加自定义权限
2018/10/15 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
演讲稿的写法
2014/05/19 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
伏羲庙导游词
2015/02/09 职场文书
中英文求职信范文
2015/03/19 职场文书
教师读书笔记
2015/06/29 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python