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实现得到一个给定类的虚函数
Sep 28 Python
python @property的用法及含义全面解析
Feb 01 Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 Python
python实现猜单词小游戏
May 22 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
对python:print打印时加u的含义详解
Dec 15 Python
Python给图像添加噪声具体操作
Mar 03 Python
对Python中画图时候的线类型详解
Jul 07 Python
Python实现基于SVM的分类器的方法
Jul 19 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
tensorflow 实现自定义layer并添加到计算图中
Feb 04 Python
Flask中jinja2的继承实现方法及实例
Mar 03 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 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
Js的MessageBox
2006/12/03 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
JavaScript中使用document.write向页面输出内容实例
2014/10/16 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
javascript数据类型详解
2017/02/07 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
使用apifm-wxapi模块中的问题及解决方法
2019/08/05 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
Python设计模式之代理模式实例
2014/04/26 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
日语专业推荐信
2013/11/12 职场文书
骨干教师考核方案
2014/05/09 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
县委常委班子专题民主生活会查摆问题及整改措施
2014/09/27 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
python实现双链表
2022/05/25 Python