旧的Spring Security OAuth已停止维护,全面拥抱最新解决方案Spring SAS

Spring Authorization Server 替换 Shiro 指引

背景

  • Spring 团队正式宣布 Spring Security OAuth 停止维护,该项目将不会再进行任何的迭代

在这里插入图片描述

  • 目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用
  • 作为 SpringBoot 3.0 的最新权限方案,JeecgBoot springboot3_sas分支,已经完成了采用Spring Authorization Server 替换 Shiro工作。

JeecgBoot SAS分支

  • Date: 2024-01-17
  • 技术栈: SpringBoot3+ Spring Authorization Server+jdk18

源码下载:

  • 后端:https://github.com/jeecgboot/jeecg-boot/tree/springboot3_sas
  • 前端:https://github.com/jeecgboot/jeecgboot-vue3/tree/springboot3_sas

登录对接

jeecg 基于Spring Authorization Server扩展了四种登录实现,加上默认提供的四种,共计有8种登录方式,额外还有OpenID Connect模式。本文不讲解授权码模式、客户端模式、刷新码模式、设备码模式、OpenID Connect模式,只会讲解jeecg实际应用了的四种扩展模式,其它模式请查阅Spring Authorization Server官方原文。

https://docs.spring.io/spring-authorization-server/reference/overview.html

注意:OpenID Connect应当仅为认证阶段使用,不可作为权限校验阶段使用。

密码模式和APP模式

密码模式在Oauth2.1协议中被放弃,Spring Authorization Server并没有对该模式提供实现,该实现是基于Spring Authorization Server提供的扩展入口实现的。

密码模式实现源码:package org.jeecg.config.security.password;

APP模式实现源码:package org.jeecg.config.security.app;

密码模式与APP模式实现完全一致,不过防止额外需求偏差,所以进行了分开实现。

请求地址:{baseUrl} /oauth2/token

请求方法:POST

请求头:

请求头名称请求头值
AuthorizationBasic base64(clientId:clientSecret)(此处需要自行替换)
Content-Typeapplication/x-www-form-urlencoded

请求参数:

参数名称参数值
grant_typepassword/app (password为PC端使用,app为移动端使用)
username用户名
password密码

响应内容:

参数名称参数含义
access_token访问token,在被限制访问的接口请求中添加Authorization: Bearer access_token
refersh_token刷新token,用于刷新码模式获取新的access_token
userInfo当前登录用户信息
其它内容不作详解,请查看源码
phone模式

phone模式用于手机+验证码登录场景。

phone模式实现源码:package org.jeecg.config.security.phone;

请求地址:{baseUrl} /oauth2/token

请求方法:POST

请求头:

请求头名称请求头值
AuthorizationBasic base64(clientId:clientSecret)(此处需要自行替换)
Content-Typeapplication/x-www-form-urlencoded

请求参数:

参数名称参数值
grant_type固定为phone
mobile手机号
captcha验证码

响应内容:

参数名称参数含义
access_token访问token,在被限制访问的接口请求中添加Authorization: Bearer access_token
refersh_token刷新token,用于刷新码模式获取新的access_token
userInfo当前登录用户信息
其它内容不作详解,请查看源码
social模式

任何一个用户中心端(比如微信、微博、github、gitee)对外提供的对接方式都是授权码模式、OpenID Connect模式,最终获取到一段用户信息(比如用户名、头像地址、邮箱),但是其实并没有办法拿着这段信息在当前系统中访问受限资源,以前都是手搓token或者其它手段来得到受限访问的权限,这种方法不可靠也不安全,而且也不易维护。

jeecg针对以上场景,基于Spring Authorization Server扩展了social模式,用于处理获取三方用户信息后,再获取当前系统的访问凭证。

social模式实现源码:package org.jeecg.config.security.social;

提示:文档中只讲解social模式的应用,不讲解从三方登录到应用social模式的全流程,jeecg前后端均已实现,细节请查看源码。

请求地址:{baseUrl} /oauth2/token

请求方法:POST

请求头:

请求头名称请求头值
AuthorizationBasic base64(clientId:clientSecret)(此处需要自行替换)
Content-Typeapplication/x-www-form-urlencoded

请求参数:

参数名称参数值
grant_type固定为social
token可获取用户信息的凭证
thirdType三方来源

响应内容:

参数名称参数含义
access_token访问token,在被限制访问的接口请求中添加Authorization: Bearer access_token
refersh_token刷新token,用于刷新码模式获取新的access_token
userInfo当前登录用户信息
其它内容不作详解,请查看源码

权限校验

可用于方法或类上,将基于注解的权限code,针对性处理方法或当前类的所有接口进行权限拦截。

基于角色
// shiro用法
@RequiresRoles("admin")// 可替换为 spring authorization server 用法
@PreAuthorize("jps.requiresRoles('admin')")
基于权限
// shiro用法
@RequiresPermissions("sys:role") // 可替换为 spring authorization server 用法
@PreAuthorize("jps.requiresPermissions('sys:role')")

角色和权限组合使用

- @PreAuthorize("@jps.requiresPermissions('system:quartzJob:add') or @jps.requiresRoles('admin')")
免登录配置
jeecg:shiro:excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/jmreport/bigscreen2/**# 替换为
security:oauth2:client:ignore-urls:- /test/jeecgDemo/demo3- /test/jeecgDemo/redisDemo/**- /jmreport/bigscreen2/**

升级小技巧

搜索替换为
org.apache.shiro.SecurityUtilsorg.jeecg.config.security.utils.SecureUtil
(LoginUser) SecurityUtils.getSubject().getPrincipal()SecureUtil.currentUser()
org.apache.shiro.authz.annotation.RequiresRolesorg.springframework.security.access.prepost.PreAuthorize
org.apache.shiro.authz.annotation.RequiresPermissionsorg.springframework.security.access.prepost.PreAuthorize
@RequiresPermissions@PreAuthorize(“jps.requiresPermissions(‘xxx’)”)
@RequiresRoles@PreAuthorize(“@jps.requiresRoles(‘xxx’)”)

升级SQL

切换springboot3_sas分支的Spring Authorization Server,需要执行升级sql

CREATE TABLE `oauth2_registered_client` (`id` varchar(100) NOT NULL,`client_id` varchar(100) NOT NULL,`client_id_issued_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,`client_secret` varchar(200) DEFAULT NULL,`client_secret_expires_at` timestamp NULL DEFAULT NULL,`client_name` varchar(200) NOT NULL,`client_authentication_methods` varchar(1000) NOT NULL,`authorization_grant_types` varchar(1000) NOT NULL,`redirect_uris` varchar(1000) DEFAULT NULL,`post_logout_redirect_uris` varchar(1000) DEFAULT NULL,`scopes` varchar(1000) NOT NULL,`client_settings` varchar(2000) NOT NULL,`token_settings` varchar(2000) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;INSERT INTO `oauth2_registered_client`
(`id`,
`client_id`,
`client_id_issued_at`,
`client_secret`,
`client_secret_expires_at`,
`client_name`,
`client_authentication_methods`,
`authorization_grant_types`,
`redirect_uris`,
`post_logout_redirect_uris`,
`scopes`,
`client_settings`,
`token_settings`)
VALUES
('3eacac0e-0de9-4727-9a64-6bdd4be2ee1f',
'jeecg-client',
now(),
'secret',
null,
'3eacac0e-0de9-4727-9a64-6bdd4be2ee1f',
'client_secret_basic',
'refresh_token,authorization_code,password,app,phone,social',
'http://127.0.0.1:8080/jeecg-',
'http://127.0.0.1:8080/',
'*',
'{"@class":"java.util.Collections$UnmodifiableMap","settings.client.require-proof-key":false,"settings.client.require-authorization-consent":true}',
'{"@class":"java.util.Collections$UnmodifiableMap","settings.token.reuse-refresh-tokens":true,"settings.token.id-token-signature-algorithm":["org.springframework.security.oauth2.jose.jws.SignatureAlgorithm","RS256"],"settings.token.access-token-time-to-live":["java.time.Duration",300000.000000000],"settings.token.access-token-format":{"@class":"org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat","value":"self-contained"},"settings.token.refresh-token-time-to-live":["java.time.Duration",3600.000000000],"settings.token.authorization-code-time-to-live":["java.time.Duration",300000.000000000],"settings.token.device-code-time-to-live":["java.time.Duration",300000.000000000]}');

常用API

1. 获取登录用户信息

LoginUser sysUser = SecureUtil.currentUser();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++异常机制(3) -- 异常类型和生命周期

目录 抛出的异常类型大致可以分为三种。 第一种 基本类型 1. 可以直接抛出常量 2. 也可以抛出定义好的变量 3. 如果我们使用const,会不会影响到异常的匹配。 第二种 字符串类型以及指针类型 1. 使用字符指针 注意: 2. 使用string类型 第三种 …

计算机专业大学生的简历,为何会出现在垃圾桶

为什么校招过后垃圾桶里全是简历,计算机专业的学生找工作有多难? 空哥这么跟你说吧,趁现在还来得及,这些事情你一定要听好了。 第一,计算机专业在学校学的东西是非常有限的,985211的还好,如果…

D365:LookUp

文章目录 前言一、复制onLookUp事件方法二、LookUp方法 前言 在Form的字段的onLookUp方法中,添加下拉框。 一、复制onLookUp事件方法 二、LookUp方法 [FormControlEventHandler(formControlStr(EcoResProductDetailsExtended, VyaKeyItemType_VyaMaterialSubCode…

面试经典150题——用最少数量的箭引爆气球

"The only person you are destined to become is the person you decide to be." - Ralph Waldo Emerson 1. 题目描述 2. 题目分析与解析 这个题目开始读题的时候是有点不好理解题意的,因此我先做个图让大家对于题意有更好更直观的理解再来分析题目。 …

如何使用Portainer创建Nginx容器并搭建web网站发布至公网可访问【内网穿透】

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

C# OpenVINO Crack Seg 裂缝分割 裂缝检测

目录 效果 模型信息 项目 代码 数据集 下载 C# OpenVINO Crack Seg 裂缝分割 裂缝检测 效果 模型信息 Model Properties ------------------------- date:2024-02-29T16:35:48.364242 author:Ultralytics task:segment version&…

【生成式AI】ChatGPT原理解析(1/3)- 对ChatGPT的常见误解

Hung-yi Lee 课件整理 文章目录 误解1误解2ChatGPT真正在做的事情-文字接龙 ChatGPT是在2022年12月7日上线的。 当时试用的感觉十分震撼。 误解1 我们想让chatGPT讲个笑话,可能会以为它是在一个笑话的集合里面随机地找一个笑话出来。 我们做一个测试就知道不是这样…

C# Post数据或文件到指定的服务器进行接收

目录 应用场景 实现原理 实现代码 PostAnyWhere类 ashx文件部署 小结 应用场景 不同的接口服务器处理不同的应用,我们会在实际应用中将A服务器的数据提交给B服务器进行数据接收并处理业务。 比如我们想要处理一个OFFICE文件,由用户上传到A服务器…

基于springboot+vue的贸易行业crm系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Java-nio

一、NIO三大组件 NIO的三大组件分别是Channel,Buffer与Selector Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通…

Windows环境下的调试器探究——硬件断点

与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于CPU中的调试寄存器。 调试寄存器有7个,分别为Dr0~Dr7。 用户最多能够设置4个硬件断点,这是由于只有Dr0~Dr3用于存储线性地址。 其中,Dr4和Dr5是保留的…

java中容器继承体系

首先上图 源码解析 打开Collection接口源码&#xff0c;能够看到Collection接口是继承了Iterable接口。 public interface Collection<E> extends Iterable<E> { /** * ...... */ } 以下是Iterable接口源码及注释 /** * Implementing this inte…

makefileGDB使用

一、makefile 1、make && makefile makefile带来的好处就是——自动化编译&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率 下面我们通过如下示例来进一步体会它们的作用&#xff1a; ①…

使用 Python 实现一个飞书/微信记账机器人,酷B了!

Python飞书文档机器人 今天的主题是&#xff1a;使用Python联动飞书文档机器人&#xff0c;实现一个专属的记账助手&#xff0c;这篇文章如果对你帮助极大&#xff0c;欢迎你分享给你的朋友、她、他&#xff0c;一起成长。 也欢迎大家留言&#xff0c;说说自己想看什么主题的…

代码随想录第天 78.子集 90.子集II

LeetCode 78 子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

LeetCode 2581.统计可能的树根数目:换根DP(树形DP)

【LetMeFly】2581.统计可能的树根数目&#xff1a;换根DP(树形DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges…

【通信基础知识】完整通信系统的流程图及各模块功能详解

2024.2.29 抱歉最近在写毕设大论文&#xff0c;因此没有太多时间更新。然而&#xff0c;在写论文的过程中&#xff0c;发现自己对通信系统的了解还不够全明白&#xff0c;因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…

YOLOv7基础 | 第2种方式:简化网络结构之yolov7.yaml(由104层简化为30层)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yaml文件简化的方法,将104层简化为30层,并且参数量和计算量和原来是一致的,…

内存占用构造方法

#使用虚拟内存构造内存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #释放消耗的虚拟内存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #内存占用可直接在/dev/shm目录下写文件

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体&#xff0c;自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型&#xff0c;通常…