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字符串编码识别模块chardet简单应用
Jun 15 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
在Python中append以及extend返回None的例子
Jul 20 Python
python 命令行传入参数实现解析
Aug 30 Python
对django layer弹窗组件的使用详解
Aug 31 Python
使用python 对验证码图片进行降噪处理
Dec 18 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
完美解决ARIMA模型中plot_acf画不出图的问题
Jun 04 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 Python
Python爬虫之爬取最新更新的小说网站
May 06 Python
Python数据类型最全知识总结
May 31 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 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
PHP的开发框架的现状和展望
2007/03/16 PHP
php Smarty 字符比较代码
2011/02/27 PHP
php中对2个数组相加的函数
2011/06/24 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
php搜索文件程序分享
2015/10/30 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
js 图片轮播(5张图片)
2008/12/30 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
python提取页面内url列表的方法
2015/05/25 Python
深入理解Python对Json的解析
2017/02/14 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
美国知名的百货清仓店:Neiman Marcus Last Call
2016/08/03 全球购物
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
大学生毕业求职信
2014/06/12 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
2015中学学校工作总结
2015/07/20 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python
Oracle中DBLink的详细介绍
2022/04/29 Oracle