详解Django CAS 解决方案


Posted in Python onOctober 30, 2019

CAS单点登录主要是为了解决主系统和子系统的统一登录问题,能够做到任意一个子系统登录成功后,再登录其他子系统后不再需要认证,让用户不用重复地进行登录认证。CAS单点登录的方案很多,并且大多数都是采用session的方式,而本文结合个人实践,着重讨论django cas token的解决方案。

本方案中,cas客户端和服务端都采用了开源项目,服务端是django-mama-cas,而客户端是django-cas-ng。

CAS Server

服务端相比于客户端要简单地多,根据github步骤一步步下载和配置就好。

下载

pip install django-mama-cas

配置

# settings.py
INSTALLED_APPS = (
  'mama_cas',
)

# 重要!,service是client的IP,是个数组,可以在后面添加SERVICE的HOST:PORT。
MAMA_CAS_SERVICES = [
  {
    'SERVICE': 'http://127.0.1.1:8000',
    'CALLBACKS': [
      'mama_cas.callbacks.user_model_attributes',   # 返回除了password的所有Field
      # 'mama_cas.callbacks.user_name_attributes', # 只返回 username
    ],
    'LOGOUT_ALLOW': True,
    'LOGOUT_URL': 'http://127.0.1.1:8000/accounts/callback',
  },
]

# urls.py
url(r'', include('mama_cas.urls')),

Client

首先是一些基本的客户端配置,比如server ip等,但是django-cas-ng默认是通过session的方式认证的,而我们需要通过token的方式认证,所以如果想继续用django-cas-ng来解决问题,那要么查看它是否有原生支持的接口,要么改源码。改源码可能不大友好,所以我优先研究了一下django-cas-ng的原生支持,无意中发现view-wrappers-example可以继承它原生的登录接口做一些封装,而我们完全通过继承原生的登录方法,然后加入我们的token相关代码。所以urls.py里面登录的方法我们写的是我们写在view.py中封装的登录方法,而并非默认的。

# settings.py
INSTALLED_APPS = (
  # ... other installed apps
  'django_cas_ng',
)

AUTHENTICATION_BACKENDS = (
  'django_cas_ng.backends.CASBackend',
)

# 注意:这是cas server的地址
CAS_SERVER_URL = 'http://127.0.0.1:8000'

# 存入所有CAS 服务端返回的user数据。
CAS_APPLY_ATTRIBUTES_TO_USER = True

# urls.py
import view import *
url(r'^accounts/login$', cas_login, name='cas_login'),

#view.py
from django_cas_ng import views as baseviews
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def cas_login(request, **kwargs):
  r = baseviews.login(request, **kwargs)
  if not request.user.is_anonymous():
    token = get_token(request)
    if token:
      r.set_cookie('token', token)
    else:
      print 'Get token error'
  else:
    print('User is anonymous')
  return r

def get_token(request, *args, **kwargs):
  user = request.user
  try:
    request_hash = AuthToken.get_request_hash(request)
    try:
      token = generate_token()  # function used to geneate token, this place won't show more detail codes
      token.refresh()
    except IndexError:
      pass
  except Exception as e:
    print e
    return False
  return token.key

生成token的方法我就不详细描述了,这边主要提供了一个思路,我们将django-cas-ng原生的登录方法进行了继承,然后生成token并放到了session当中。

总结

本文主要为CAS Token方案提供一个思路,如果集成进已有项目中,肯定会遇到很多细节问题,不过万变不离其宗,我们首先要熟悉手中运用的工具,然后要善于在此基础之上根据自己的定制需求进行开发,多看看文档和源码,每一次可能都会有新的发现。

Refer

使用django-mama-cas快速搭建CAS服务
Django实现CAS+OAuth2

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

Python 相关文章推荐
比较详细Python正则表达式操作指南(re使用)
Sep 06 Python
python查看zip包中文件及大小的方法
Jul 09 Python
Python 基础之字符串string详解及实例
Apr 01 Python
一个基于flask的web应用诞生(1)
Apr 11 Python
python实现折半查找和归并排序算法
Apr 14 Python
50行Python代码实现人脸检测功能
Jan 23 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
Flask之flask-script模块使用
Jul 26 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
Django 开发环境配置过程详解
Jul 18 Python
Python编译为二进制so可执行文件实例
Dec 23 Python
解决python 读取 log日志的编码问题
Dec 24 Python
详解使用django-mama-cas快速搭建CAS服务的实现
Oct 30 #Python
Django实现CAS+OAuth2的方法示例
Oct 30 #Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 #Python
Python使用Opencv实现图像特征检测与匹配的方法
Oct 30 #Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 #Python
使用Python刷淘宝喵币(低阶入门版)
Oct 30 #Python
Python自动化完成tb喵币任务的操作方法
Oct 30 #Python
You might like
Terran兵种对照表
2020/03/14 星际争霸
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
PHP中strtr字符串替换用法详解
2014/11/26 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
Javascript & DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
python妹子图简单爬虫实例
2015/07/07 Python
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
python绘制简单折线图代码示例
2017/12/19 Python
python中bytes和str类型的区别
2019/10/21 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
Python的logging模块基本用法
2020/12/24 Python
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
《王二小》教学反思
2014/02/27 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
如何使用flask将模型部署为服务
2021/05/13 Python