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 相关文章推荐
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
对pandas的算术运算和数据对齐实例详解
Dec 22 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
python3.6编写的单元测试示例
Aug 17 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
Oct 23 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
Apr 03 Python
Python生成器next方法和send方法区别详解
May 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
Flask框架 CSRF 保护实现方法详解
Oct 30 #Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 #Python
You might like
php获取一个变量的名字的方法
2014/09/05 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
javascript定时器完整实例
2015/02/10 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
python进行两个表格对比的方法
2018/06/27 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
对于Python深浅拷贝的理解
2019/07/29 Python
浅谈Python 参数与变量
2020/06/20 Python
python获取整个网页源码的方法
2020/08/03 Python
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
教师实习自我鉴定
2013/12/13 职场文书
餐饮加盟计划书
2014/01/10 职场文书
打架检讨书800字
2014/01/10 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
员工福利申请报告
2015/05/15 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python