Django实现CAS+OAuth2的方法示例


Posted in Python onOctober 30, 2019

CAS

Solution

  • 使用CAS作为认证协议。
  • A作为主要的认证提供方(provider)。
  • A保留用户系统,其余系统如xxx/www不保留用户系统,即Provider的实现在A。
  • 实现步骤
    • xxx 选择登录,跳转到LMS的认证界面,CAS读取数据库进行认证,redirect到xxx的界面并且附带ticket在url中,在浏览器中存入Cookie。
    • xxx得到ticket后向CAS发送ticket验证有效性。
    • xxx允许用户访问内部资源。

django代码

初始化一个client项目

django-admin startproject cas-client

Install Dependencies

pip install django-mama-cas # server
pip install django-cas-ng # client

Server

# settings.py
INSTALLED_APPS = (
  'mama_cas',
)

# 允许退出登录,可选项
MAMA_CAS_ENABLE_SINGLE_SIGN_OUT = True

# 重要!,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')),

不要忘记:

python3 manage.py migrate

Client

# settings.py
INSTALLED_APPS = (
  # ... other installed apps
  'django_cas_ng',
)

AUTHENTICATION_BACKENDS = (
  'django.contrib.auth.backends.ModelBackend',
  'django_cas_ng.backends.CASBackend',
)

# 也就是LMS的地址
CAS_SERVER_URL = 'http://127.0.0.1:8000'
CAS_VERSION = '3'

# 存入所有CAS 服务端返回的user数据。
CAS_APPLY_ATTRIBUTES_TO_USER = True

# urls.py
import django_cas_ng.views as cas_views
url(r'^accounts/login$', cas_views.login, name='cas_ng_login'),
url(r'^accounts/logout$', cas_views.logout, name='cas_ng_logout'),
url(r'^accounts/callback$', cas_views.views.callback, name='cas_ng_proxy_callback'),

Also:

python3 manage.py migrate

使用流程

  • client上选择登录,后台redirect到server的/accounts/login。
  • 认证通过,在client上的host下会有登录Cookie,成功登录到系统,重定向到client的主页。
  • client上选择退出,后台redirect到server的/accounts/logout。

注意事项

  • server与client不能在同一个host下,会发生500内部错误,因为Cookie要存回client的host下。
  • 本地测试下,client启动在127.0.1.1:8000的时候,要在settings.py中ALLOWED_HOSTS中添加这个IP。
  • client端要实现接收空路由情况,在CAS Server认证完毕后,返回地址为根地址。
  • client端退出登录同样要经过CAS Server,同时要在CAS Server中打开允许退出登录。

Oauth2 结合 CAS 搭建认证系统

  • 在CAS页面,点击Github登录,利用state参数保存当前页面的service参数。
  • 点击确认登陆后,返回state,获取用户数据,重定向到一个处理函数。
  • 登录系统,发送ticket,重定向到service。
  • 两个request不是同一个request,所以无法用session或cookie保存service的url。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python求素数示例分享
Feb 16 Python
python自动发送邮件脚本
Jun 20 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
Python实现Dijkstra算法
Oct 17 Python
Python3.5运算符操作实例详解
Apr 25 Python
Python with用法:自动关闭文件进程
Jul 10 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
django orm模块中的 is_delete用法
May 20 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
python集合的新增元素方法整理
Dec 07 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 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
Flask框架 CSRF 保护实现方法详解
Oct 30 #Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 #Python
You might like
ThinkPHP实现附件上传功能
2017/04/27 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
vue跨域解决方法
2017/10/15 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
通过js给网页加上水印背景实例
2019/06/17 Javascript
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
Python定义一个函数的方法
2020/06/15 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
医学院学生的自我评价分享
2013/11/19 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
路政管理毕业自荐书范文
2014/02/10 职场文书
美术指导求职信
2014/03/17 职场文书
教师党员承诺书
2014/03/25 职场文书
班主任班级寄语大全
2014/04/04 职场文书
求职自荐信的格式
2014/04/07 职场文书
专家推荐信范文
2015/03/26 职场文书
道歉短信大全
2015/05/12 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
师范生见习总结范文
2015/06/23 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
JS实现数组去重的11种方法总结
2022/04/04 Javascript
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android