详解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脚本将文字转换为图片的实例分享
Aug 29 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
python smtplib模块实现发送邮件带附件sendmail
May 22 Python
WxPython建立批量录入框窗口
Feb 27 Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 Python
Django框架视图介绍与使用详解
Jul 18 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
Python中zip函数如何使用
Jun 04 Python
用python开发一款操作MySQL的小工具
May 12 Python
Python Django模型详解
Oct 05 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 FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
js与C#进行时间戳转换
2014/11/14 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
python写入已存在的excel数据实例
2018/05/03 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
python3让print输出不换行的方法
2020/08/24 Python
一文读懂Python 枚举
2020/08/25 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
王老吉广告词
2014/03/20 职场文书
七夕情人节促销方案
2014/06/07 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
2016中秋节广告语
2016/01/28 职场文书
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers