详解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网络编程学习笔记(四):域名系统
Jun 09 Python
python制作花瓣网美女图片爬虫
Oct 28 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
Python扩展内置类型详解
Mar 26 Python
Python实现的基于优先等级分配糖果问题算法示例
Apr 25 Python
python实现决策树分类
Aug 30 Python
Django中如何使用sass的方法步骤
Jul 09 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
python打包成so文件过程解析
Sep 28 Python
详解python破解zip文件密码的方法
Jan 13 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 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读取MySQL数据代码
2008/06/05 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
Using the TextRange Object
2006/10/14 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
JS验证不重复验证码
2017/02/10 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
python中实现定制类的特殊方法总结
2014/09/28 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
Python对列表的操作知识点详解
2019/08/20 Python
python下载库的步骤方法
2019/10/12 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
J2EE面试题大全
2016/08/06 面试题
教师产假请假条
2014/04/10 职场文书
教师求职信范文
2014/05/24 职场文书
检察院起诉意见书
2015/05/20 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
java多态注意项小结
2021/10/16 Java/Android