基于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 相关文章推荐
TensorFlow实现Batch Normalization
Mar 08 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
python3 拼接字符串的7种方法
Sep 12 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
Flask框架学习笔记之消息提示与异常处理操作详解
Aug 15 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
python实现udp传输图片功能
Mar 20 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
destoon各类调用汇总
2014/06/20 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
商务主管岗位职责
2013/12/08 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
同意报考证明
2015/06/17 职场文书
一文搞懂Python Sklearn库使用
2021/08/23 Python