详解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 相关文章推荐
把MySQL表结构映射为Python中的对象的教程
Apr 07 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
Python装饰器知识点补充
May 28 Python
Python爬虫框架Scrapy常用命令总结
Jul 26 Python
Django中使用第三方登录的示例代码
Aug 20 Python
python的pip安装以及使用教程
Sep 18 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
python去重,一个由dict组成的list的去重示例
Jan 21 Python
django解决订单并发问题【推荐】
Jul 31 Python
python安装dlib库报错问题及解决方法
Mar 16 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
Oct 22 Python
python中pandas对多列进行分组统计的实现
Jun 18 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
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
Python3 入门教程 简单但比较不错
2009/11/29 Python
python实现比较两段文本不同之处的方法
2015/05/30 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
python中学习K-Means和图片压缩
2017/11/20 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
Python 监测文件是否更新的方法
2019/06/10 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
python RSA加密的示例
2020/12/09 Python
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
幼儿师范毕业生自荐信
2013/11/09 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
小马王观后感
2015/06/11 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书