详解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根据路径导入模块的方法
Sep 30 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
Python with用法:自动关闭文件进程
Jul 10 Python
Django ModelForm组件使用方法详解
Jul 23 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
Python2手动安装更新pip过程实例解析
Jul 16 Python
Python基于内置函数type创建新类型
Oct 22 Python
Python paramiko使用方法代码汇总
Nov 20 Python
python使用scapy模块实现ARP扫描的过程
Jan 21 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
pyqt5蒙版遮罩mask,setmask的使用
Jun 11 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中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
详解PHP归并排序的实现
2016/10/18 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
[原创]来自ImageSee官方 JavaScript图片浏览器
2008/01/16 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
Python中unittest用法实例
2014/09/25 Python
python安装以及IDE的配置教程
2015/04/29 Python
python控制台中实现进度条功能
2015/11/10 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
Python进度条的制作代码实例
2019/08/31 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
入党申请人的自我鉴定
2013/12/01 职场文书
劳动模范事迹材料
2014/01/19 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
个人授权委托书
2014/09/15 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
sql字段解析器的实现示例
2021/06/23 SQL Server
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python
sql注入报错之注入原理实例解析
2022/06/10 MySQL