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的Django框架使用的一些实用建议
Apr 03 Python
浅谈Python中copy()方法的使用
May 21 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
Python字符串逆序输出的实例讲解
Feb 16 Python
python使用PyQt5的简单方法
Feb 27 Python
Python中一般处理中文的几种方法
Mar 06 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
python脚本框架webpy模板控制结构
Nov 20 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防盗链的常用方法小结
2010/07/02 PHP
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
js实现金山打字通小游戏
2020/07/24 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
python打包多类型文件的操作方法
2020/09/21 Python
python实现计算器简易版
2020/12/17 Python
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
工商学院毕业生自荐信
2013/11/12 职场文书
护理专业自荐信
2013/12/03 职场文书
自主招生自荐信格式
2013/12/03 职场文书
房地产营销策划方案
2014/02/08 职场文书
小学生评语大全
2014/04/18 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
销售人才自我评价范文
2014/09/27 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang