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 文件和路径操作函数小结
Nov 23 Python
Python中的Matplotlib模块入门教程
Apr 15 Python
python中异常捕获方法详解
Mar 03 Python
Python排序算法实例代码
Aug 10 Python
解决Python3.5+OpenCV3.2读取图像的问题
Dec 05 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
python实现图片压缩代码实例
Aug 12 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
May 07 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函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
PHP微信API接口类
2016/08/22 PHP
PHP实现百度人脸识别
2019/05/06 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
Django小白教程之Django用户注册与登录
2016/04/22 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
python绘制雷达图实例讲解
2021/01/03 Python
python自动生成证件号的方法示例
2021/01/14 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
会计系个人求职信范文分享
2013/12/20 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
护士自荐信范文
2015/03/25 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers