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 序列化 pickle/cPickle模块使用介绍
Nov 30 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
python 文件转成16进制数组的实例
Jul 09 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
Django 源码WSGI剖析过程详解
Aug 05 Python
Python实现随机取一个矩阵数组的某几行
Nov 26 Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 Python
Python文件时间操作步骤代码详解
Apr 13 Python
Python xpath表达式如何实现数据处理
Jun 13 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
python调用win32接口进行截图的示例
Nov 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
php编程每天必学之表单验证
2016/03/01 PHP
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
python实现数组插入新元素的方法
2015/05/22 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
Python文件的读写和异常代码示例
2017/10/31 Python
基于Python的文件类型和字符串详解
2017/12/21 Python
django中send_mail功能实现详解
2018/02/06 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Python切片操作深入详解
2018/07/27 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
九年级数学教学反思
2014/02/02 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
《观察物体》教学反思
2016/02/17 职场文书