Django实现CAS+OAuth2的方法示例
作者:Wind_white 发布时间:2023-01-26 17:32:46
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。
来源:https://blog.csdn.net/wind_white/article/details/78805312
猜你喜欢
- 网页设计遇到最大的麻烦之一莫过于网页对不同浏览器的兼容性问题了,因为IE 6.0 / IE 7.0 / firefox 2 / Opera
- 上次帮朋友写过的一个简单切换效果,超级简单,但也比较适用.因为用到了CSS Sprite技术,DEMO中附带了IE6兼容png的JS.核心J
- 应该是很方便的了,支持几乎所有主流浏览器(ie5,6,7,8;ff;傲游;Opera)已更新至可提交录入内容<script type=
- 正则表达式是处理字符串的强大工具。作为一个概念而言,正则表达式对于Python来说并不是独有的。但是,Python中的正则表达式在实际使用过
- 本文实例讲述了Python注释、分支结构、循环结构、伪“选择结构”用法。分享给大家供大家参考,具体如下:注释:python使用#作为行注释符
- 1.类方法类方法是从属于"类对象"的方法。类对象可以通过装饰器@classmethod来定义,具体格式如下:@class
- 这篇分享几个在地址栏实现的Javascript有趣效果和应用。能在浏览器地址栏实现的效果太多了,字体放大、显示所有图片、显示Cookie等等
- px比em更加容易使用,em指字体高,任意浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px,所以10px=0.
- 语法结构: 1. Cast 语法结构:CAST ( expression AS data_type [ ( length ) ] ) 2.
- 在通过拼组sql语句来实现数据插入的应用中,我们很有可能会遇到需要插入大型数据的情况,例如,在oracle中需要插入字节数超过4000的字段
- 在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下:python [-bBdEhiIOqsSuvV
- 如何做一个分页程序? 这在ASP中确实容易实现,但需要技巧,看看下面的分页代码和说明: <angu
- 如何对PHP程序中的常见漏洞进行攻击(下) 翻译:analysist(分析家) 来源:http://www.china4lert.org 如
- 了兑现我对大家的承诺,我们现在立即就将“借助数据库和ASP程序”编写出来的,可以同时适用于IIS和P
- 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。Pyt
- python中eval和int的区别是什么?下面给大家介绍一下:1.eval()函数eval(<字符串>)能够以Python表达
- 前言golang实现定时任务很简单,只须要简单几步代码即可以完成,最近在做了几个定时任务,想研究一下它内部是怎么实现的,所以将源码过了一遍,
- 一、标识符何为标识符?标识符是用来标识某个实体的一个符号。在编程语言中,标识符是计算机语言中作为名字的有效字符串集合。标识符是用户编程时使用
- 功能:创建两个滑动条来分别控制高斯核的size和σσ的大小,这个程序是在阈值分割的那个程序上改动的。阈值分割程序在这 注意:由于σ=0σ=0
- 一、简介你一定用过那种“OCR神器”,可以把图片中的文字提取出来,极大的提高工作效率。今天,我们就来做一款实时截图识别的小工具。顾名思义,运