详解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数字图像处理之高级滤波代码详解
Nov 23 Python
python实现音乐下载器
Apr 15 Python
Python DataFrame.groupby()聚合函数,分组级运算
Sep 18 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
使用python实现画AR模型时序图
Nov 20 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
Python批量处理csv并保存过程解析
May 16 Python
Python常用类型转换实现代码实例
Jul 28 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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
如何隐藏你的.php文件
2007/01/04 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php获取域名的google收录示例
2014/03/24 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
jquery文本框中的事件应用以输入邮箱为例
2014/05/06 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
python时间日期操作方法实例小结
2020/02/06 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
《我要的是葫芦》教学反思
2014/02/23 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
教师师德演讲稿
2014/05/06 职场文书
校园广播稿100字
2014/10/06 职场文书