详解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的Django框架中if标签的相关使用
Jul 15 Python
Python数据操作方法封装类实例
Jun 23 Python
Python3.5内置模块之random模块用法实例分析
Apr 26 Python
Python 数据可视化pyecharts的使用详解
Jun 26 Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
python实现udp传输图片功能
Mar 20 Python
python 实现客户端与服务端的通信
Dec 23 Python
一篇文章弄懂Python中的内建函数
Aug 07 Python
图神经网络GNN算法
May 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
Terran热键控制
2020/03/14 星际争霸
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
PHP中用hash实现的数组
2011/07/17 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
python多线程方式执行多个bat代码
2016/06/07 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
python学习将数据写入文件并保存方法
2020/06/07 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
回门宴答谢词
2014/01/13 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
借条格式范本
2015/05/25 职场文书
庆七一活动简报
2015/07/20 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书