详解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实现数通设备端口监控示例
Apr 02 Python
python logging类库使用例子
Nov 22 Python
Python Sleep休眠函数使用简单实例
Feb 02 Python
Python使用爬虫猜密码
Feb 19 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
python实现kNN算法识别手写体数字的示例代码
Aug 16 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
Aug 22 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
python中time.ctime()实例用法
Feb 03 Python
如何在python中实现ECDSA你知道吗
Nov 23 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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
php获取域名的google收录示例
2014/03/24 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
python自定义解析简单xml格式文件的方法
2015/05/11 Python
Python File(文件) 方法整理
2019/02/18 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
python实现超市商品销售管理系统
2019/10/25 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
大学生个人推荐信范文
2013/11/25 职场文书
产品推广策划方案
2014/05/10 职场文书
学校教研活动总结
2014/07/02 职场文书
公司离职证明标准样本
2014/10/05 职场文书
小学班主任事迹材料
2014/12/17 职场文书
邀请函的格式
2015/01/30 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书