Django集成CAS单点登录的方法示例


Posted in Python onJune 10, 2019

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

CAS 的通讯流程图如下(图片来自Google图库):

Django集成CAS单点登录的方法示例

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

  1. 前端访问后端登录接口
  2. 后端返回重定向到 CAS 服务器的登录页面,并携带当前用户访问的网页链接
  3. 用户登录,浏览器发送请求到 CAS 服务器进行认证
  4. CAS 认证通过,将本次登录保存到会话,返回回调地址给后端
  5. 后端返回重定向请求给前端
  6. 前端重定向到跳转登录前的页面

中间涉及到的 TGT 处理逻辑已经由开源 CAS Client(python-cas) 实现。

要注意,CAS 服务器本身有一些过滤条件,例如域名白名单等,因此接入的时候需要将新系统的域名或 IP 加入 CAS 服务端配置中。

出于安全考虑,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

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',
    ],
  },
]

使用

# 使用任意端口都可,此处我使用 30000
python manage.py runserver 0.0.0.0:30000

服务启动后,可以访问 http://0.0.0.0:30000/login 到达 CAS 登录页面。

问题来了,用户名密码是什么呢?

我着实花了点时间才解决这个问题———— django-mama-cas 默认使用的是 django.auth 模块 User ,使用 django-admin 创建超级用户,该用户也就可以用于登录 CAS :

python manage.py createsuperuser

输入用户密码即完成超级用户创建,接着使用这个用户登录即可。

CAS 客户端

Python 有开源的 CAS 客户端 python-cas ,由于我使用的 Django 开发后端,因此直接选用封装好 python-cas 的 Django 应用 django-cas-ng

配置

同样需要先安装依赖:

pip install django-cas-ng

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

参考

https://github.com/jbittel/django-mama-cas
https://django-mama-cas.readthedocs.io/en/latest/
https://github.com/mingchen/django-cas-ng

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

Python 相关文章推荐
python base64 decode incorrect padding错误解决方法
Jan 08 Python
Python操作MySQL简单实现方法
Jan 26 Python
Python中Random和Math模块学习笔记
May 18 Python
Python基于DES算法加密解密实例
Jun 03 Python
Python实现两款计算器功能示例
Dec 19 Python
解决python爬虫中有中文的url问题
May 11 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
tensorflow 实现数据类型转换
Feb 17 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 Python
详解Python中的测试工具
Jun 09 #Python
Python中函数参数匹配模型详解
Jun 09 #Python
Python程序包的构建和发布过程示例详解
Jun 09 #Python
Python面向对象之继承和多态用法分析
Jun 08 #Python
Python基本数据结构之字典类型dict用法分析
Jun 08 #Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 #Python
Python面向对象之类的封装操作示例
Jun 08 #Python
You might like
初学CAKEPHP 基础教程
2009/11/02 PHP
PHP 第一节 php简介
2012/04/28 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
实现js保留小数点后N位的代码
2014/11/13 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
对Python 语音识别框架详解
2018/12/24 Python
Python初学者常见错误详解
2019/07/02 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
函授自我鉴定范文
2014/02/06 职场文书
中文教师求职信
2014/02/22 职场文书
大班开学家长寄语
2014/04/04 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
电子商务求职信
2014/06/15 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
学校通报表扬范文
2015/05/04 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
OpenCV实现反阈值二值化
2021/11/17 Java/Android
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android