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实现按学生年龄排序的实际问题详解
Aug 29 Python
Python多层装饰器用法实例分析
Feb 09 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
在Python中使用gRPC的方法示例
Aug 08 Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
Python数据类型之String字符串实例详解
May 08 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
Apr 01 Python
Python爬虫如何应对Cloudflare邮箱加密
Jun 24 Python
Python如何将装饰器定义为类
Jul 30 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 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
将RTF格式的文件转成HTML并在网页中显示的代码
2006/10/09 PHP
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
javascript string字符串优化问题
2011/07/31 Javascript
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
python自动安装pip
2014/04/24 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
python3实现名片管理系统
2020/11/29 Python
PyQT5 QTableView显示绑定数据的实例详解
2019/06/25 Python
Python flask框架post接口调用示例
2019/07/03 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
Python logging模块handlers用法详解
2020/08/14 Python
Python 里最强的地图绘制神器
2021/03/01 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
应届生煤化工求职信
2013/10/21 职场文书
《可爱的动物》教学反思
2014/02/22 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
食品安全标语
2014/06/07 职场文书
运动会横幅标语
2014/06/17 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js