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之折腾一下目录
Oct 24 Python
Python3控制路由器——使用requests重启极路由.py
May 11 Python
详解python发送各类邮件的主要方法
Dec 22 Python
Python简单实现socket信息发送与监听功能示例
Jan 03 Python
利用python库在局域网内传输文件的方法
Jun 04 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
Python接收手机短信的代码整理
Aug 02 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
zend framework多模块多布局配置
2011/02/26 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
python封装对象实现时间效果
2020/04/23 Python
使用python实现tcp自动重连
2017/07/02 Python
Numpy数组的保存与读取方法
2018/04/04 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
python基于opencv检测程序运行效率
2019/12/28 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
顶岗实习接收函
2014/01/09 职场文书
工作决心书范文
2014/03/11 职场文书
环保项目建议书
2014/08/26 职场文书
基于Python实现nc批量转tif格式
2022/08/14 Python