详解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 相关文章推荐
用不到50行的Python代码构建最小的区块链
Nov 16 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
单链表反转python实现代码示例
Feb 08 Python
mac下如何将python2.7改为python3
Jul 13 Python
浅谈Python在pycharm中的调试(debug)
Nov 29 Python
python 调用钉钉机器人的方法
Feb 20 Python
Python3中urlencode和urldecode的用法详解
Jul 23 Python
python @classmethod 的使用场合详解
Aug 23 Python
python提取xml里面的链接源码详解
Oct 15 Python
使用python创建生成动态链接库dll的方法
May 09 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
Python实现排序方法常见的四种
Jul 15 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去除字符串换行符示例分享
2014/02/13 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
详解JS数值Number类型
2018/02/07 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
用Python编写简单的微博爬虫
2016/03/04 Python
python实现按行切分文本文件的方法
2016/04/18 Python
Python实现两款计算器功能示例
2017/12/19 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
多个python文件调用logging模块报错误
2020/02/12 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
Python多进程编程常用方法解析
2020/03/26 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
森林防火宣传标语
2014/06/27 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle