详解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中for语句简单遍历数据的方法
May 07 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
Python实现句子翻译功能
Nov 14 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
Python用for循环实现九九乘法表
May 31 Python
Python设计模式之模板方法模式实例详解
Jan 17 Python
python图片二值化提高识别率代码实例
Aug 24 Python
Python银行系统实战源码
Oct 25 Python
Scrapy框架实现的登录网站操作示例
Feb 06 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
教你怎么用python爬取爱奇艺热门电影
May 20 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项目应该注意的几点事项分享
2013/12/20 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
详解js访问对象的属性和方法
2018/10/25 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
[00:10]神之谴戒
2019/03/06 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
Python写的一个简单监控系统
2015/06/19 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
python3.x实现发送邮件功能
2018/05/22 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
Python原始套接字编程实例解析
2020/01/29 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
pandas分组聚合详解
2020/04/10 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
Java程序员面试90题
2013/10/19 面试题
优秀党员主要事迹
2014/01/19 职场文书
社区平安建设汇报材料
2014/08/14 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
小学工作总结2015
2015/05/04 职场文书
项目战略合作意向书
2015/05/08 职场文书
四大名著读书笔记
2015/06/25 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript