详解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线程锁(thread)学习示例
Dec 04 Python
Python中urllib2模块的8个使用细节分享
Jan 01 Python
Python自动调用IE打开某个网站的方法
Jun 03 Python
Python爬虫包BeautifulSoup简介与安装(一)
Jun 17 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
Python调用服务接口的实例
Jan 03 Python
Python实现程序判断季节的代码示例
Jan 28 Python
Python Django form 组件动态从数据库取choices数据实例
May 19 Python
Python Unittest原理及基本使用方法
Nov 06 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 Python
详解python的异常捕获
Mar 03 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 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
substr()函数中文版
2006/10/09 PHP
中篇:安装及配置PHP
2006/12/13 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
2013/07/04 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
javascript头像上传代码实例
2019/09/28 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[03:49]辉夜杯现场龙骑士COSER秀情商“我喜欢芬队!”
2015/12/27 DOTA
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
Python中的自定义函数学习笔记
2014/09/23 Python
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
Python内置函数delattr的具体用法
2017/11/23 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
Python timeit模块的使用实践
2020/01/13 Python
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
高校辅导员推荐信范文
2013/12/25 职场文书
报关报检委托书
2014/04/08 职场文书
2015年征兵工作总结
2015/07/23 职场文书
值班管理制度范本
2015/08/06 职场文书
python入门之算法学习
2021/04/22 Python
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL