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 相关文章推荐
仅利用30行Python代码来展示X算法
Apr 01 Python
速记Python布尔值
Nov 09 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
解读python logging模块的使用方法
Apr 17 Python
Django项目实战之用户头像上传与访问的示例
Apr 21 Python
python实现移位加密和解密
Mar 22 Python
Python3 实现减少可调用对象的参数个数
Dec 20 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
python 解决函数返回return的问题
Dec 05 Python
如何用Python编写一个电子考勤系统
Feb 08 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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获取网页内容方法总结
2008/12/04 PHP
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
python数据结构之二叉树的建立实例
2014/04/29 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
python队列原理及实现方法示例
2019/11/27 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
用Python 执行cmd命令
2020/12/18 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
门卫岗位职责
2013/11/15 职场文书
编辑求职信样本
2013/12/16 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
小孩不笨观后感
2015/06/03 职场文书
环保证明
2015/06/23 职场文书
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript