详解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实现的简单万年历例子分享
Apr 25 Python
python爬虫获取多页天涯帖子
Feb 23 Python
django输出html内容的实例
May 27 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 Python
python代码编写计算器小程序
Mar 30 Python
基于多进程中APScheduler重复运行的解决方法
Jul 22 Python
python双端队列原理、实现与使用方法分析
Nov 27 Python
解决Django Haystack全文检索为空的问题
May 19 Python
Python图像处理之图像拼接
Apr 28 Python
python数据分析之单因素分析线性拟合及地理编码
Jun 25 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原理的opcodes(操作码)
2010/10/26 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
原生js 秒表实现代码
2012/07/24 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
Python的SQLAlchemy框架使用入门
2015/04/29 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
Linux文件系统类型
2012/09/16 面试题
树转促学习心得体会
2014/09/10 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
授权委托书怎么写
2014/09/25 职场文书
儿子满月酒致辞
2015/07/29 职场文书
Python图像处理之图像拼接
2021/04/28 Python
使用numpy nonzero 找出非0元素
2021/05/14 Python