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中splitlines()方法的使用简介
May 20 Python
基于python实现的抓取腾讯视频所有电影的爬虫
Apr 22 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
Pyinstaller打包.py生成.exe的方法和报错总结
Apr 02 Python
python3实现猜数字游戏
Dec 07 Python
关于pytorch中网络loss传播和参数更新的理解
Aug 20 Python
python脚本后台执行方式
Dec 21 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
python怎么提高计算速度
Jun 11 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
利用js调用后台php进行数据处理原码
2006/10/09 PHP
zf框架的Filter过滤器使用示例
2014/03/13 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
JavaScript 函数调用规则
2009/09/14 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
Angularjs自定义指令Directive详解
2017/05/27 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
关于vue面试题汇总
2018/03/20 Javascript
Vue中使用webpack别名的方法实例详解
2018/06/19 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
python每次处理固定个数的字符的方法总结
2013/01/29 Python
python判断字符串是否纯数字的方法
2014/11/19 Python
tensorflow实现图像的裁剪和填充方法
2018/07/27 Python
python使用pandas处理大数据节省内存技巧(推荐)
2019/05/05 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
个人函授自我鉴定
2014/03/25 职场文书
应届生求职信范文
2014/06/30 职场文书
讲党性心得体会
2014/09/03 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
病假证明模板
2015/06/19 职场文书
运动员加油词
2015/07/18 职场文书
党性修养心得体会2016
2016/01/21 职场文书
mysql自增长id用完了该怎么办
2022/02/12 MySQL