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

news2024/9/24 5:26:48

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.coloradmin.cn/o/1483650.html

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

相关文章

C#中什么是非托管代码?托管代码和非托管代码有什么区别

在C#中,托管代码和非托管代码是两种不同类型的代码,它们在内存管理和执行环境上有所不同。 托管代码(Managed Code): 托管代码是由.NET运行时(CLR,Common Language Runtime)管理和执…

Neo4j学习笔记2:使用Neo4j-admin import快速初始化导入数据

上一篇提到过小规模数据如何新增到数据库,但是一旦数据开始变多,效率就不够看了 同样的数据,使用上一篇的方法,预计要26天,但是使用Neo4j-admin import只要1分钟 参考文档在这里 文件处理 具体的导入csv文件结构可以…

没有经验的新手小白能做抖音小店无货源吗?

大家好,我是电商花花。 一个没有电商经验,没有货源的新手能做抖音小店吗? 这应该是很多想做抖音小店的一个疑虑吧,想做又担心做不好。 今天花花说一下关于我个人对抖音小店无货源的一些小见解吧,希望能给到你建议。 …

为什么网站页面没有被百度搜索收录?是网站被攻击了?

例如,为什么网站页面没有被百度搜索收录? 网站是否受到攻击? 网站索引量和网站流量之间有关系吗? 您在运行网站或小程序时是否有过这样的疑问? 下面我将为大家详细解答这些问题。 1.PC/H5站点相关 1、为什么新网站页面…

【真机Bug】异步加载资源未完成访问单例导致资源创建失败

1.错误表现描述 抽卡时,10抽展示界面为A。抽取内容可能是整卡或者碎片,抽到整卡,会有立绘展示和点击详情的按钮。点击详情后出现详情页B。【此时界面A预制体被销毁,卡片数据进入数据缓存池】点击页面B的返回按钮,单例…

2024理解这几个安全漏洞,你也能做安全测试!

如今安全问题显得越来越重要,一个大型的互联网站点,你如果每天查看日志,会发现有很多尝试攻击性的脚本。 如果没有,证明网站影响力还不够大。信息一体化的背后深藏着各类安全隐患,例如由于开发人员的不严谨导致为Web应…

【计算复杂性理论】证明复杂性(九):命题鸽巢原理的指数级归结下界——更简短的证明

往期文章: 【计算复杂性理论】证明复杂性(Proof Complexity)(一):简介 【计算复杂性理论】证明复杂性(二):归结(Resolution)与扩展归结&#xff…

基于springboot实现二手图书交易平台系统项目【项目源码+论文说明】

基于springboot实现二手图书交易平台系统演示 摘要 本文讲述了基于B/S模式的校园二手交易网站统的设计与实现。所谓的校园二手交易网站统是通过网站推广互联企业的二手物品和技术服务,并使客户随时可以了解企业和企业的产品,为客户提供在线服务和订单处…

【2024最新版】我用python代码带你看最绚烂的烟花,浪漫永不过时!

2024年就快要到了,提前用python代码给自己做一个烟花秀庆祝一下。本次介绍的python实例是实现一个简易的烟花秀。 一、步骤分析 总的来说,要实现烟花秀的效果,需要以下几个步骤: 1.1、创建一个类,包含烟花各项粒子的…

Golang 调度器 GPM模型

Golang 调度器 GPM模型 1 多进程/线程时代有了调度器需求 在多进程/多线程的操作系统中,就解决了阻塞的问题,因为一个进程阻塞cpu可以立刻切换到其他进程中去执行,而且调度cpu的算法可以保证在运行的进程都可以被分配到cpu的运行时间片。这…

Springboot项目实战

文章目录 SpringBootVue后台管理系统所需软件下载、安装、版本查询Vue搭建一个简单的Vue项目 *Spring项目项目架构 SpringBootVue后台管理系统 学习视频: https://www.bilibili.com/video/BV1U44y1W77D/?spm_id_from333.337.search-card.all.click&vd_sourcec…

搜索算法(算法竞赛、蓝桥杯)--DFS迭代加深

1、B站视频链接&#xff1a;B25 迭代加深 Addition Chains_哔哩哔哩_bilibili 题目链接&#xff1a;Addition Chains - 洛谷 #include <bits/stdc.h> using namespace std; int n,d;//d为搜索的深度 int a[10005];//存储加成的序列bool dfs(int u){//搜索第u层 if(ud)r…

【论文阅读】基于图像处理和卷积神经网络的板式换热器气泡识别与跟踪

Bubble recognizing and tracking in a plate heat exchanger by using image processing and convolutional neural network 基于图像处理和卷积神经网络的板式换热器气泡识别与跟踪 期刊信息&#xff1a;International Journal of Multiphase Flow 2021 期刊级别&#xff1a;…

【Spring Boot 源码学习】BootstrapRegistry 初始化器实现

《Spring Boot 源码学习系列》 BootstrapRegistry 初始化器实现 一、引言二、往期内容三、主要内容3.1 BootstrapRegistry3.2 BootstrapRegistryInitializer3.3 BootstrapRegistry 初始化器实现3.3.1 定义 DemoBootstrapper3.3.2 添加 DemoBootstrapper 四、总结 一、引言 前面…

反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打开题目 题目源码&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&qu…

2024年腾讯云优惠政策_腾讯云TOP10优惠活动

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

医学大数据|文献阅读|有关“胃癌+机器学习”的研究记录

目录 1.基于32基因特征构建的机器学习模型可有效预测胃癌患者的预后和治疗反应 2.胃癌患者术后90天死亡率的机器学习风险预测模型 3.使用机器学习模型预测幽门螺杆菌根除患者胃癌患病风险 4.利用初始内窥镜检查和组织学结果进行个性化胃癌发病率预测 1.基于32基因特征构建的…

马斯克指控OpenAI违背成立协议,要求恢复开源;Automattic否认向AI公司出售用户数据

&#x1f989; AI新闻 &#x1f680; 马斯克指控OpenAI违背成立协议&#xff0c;要求恢复开源 摘要&#xff1a;马斯克近日在旧金山高等法院对OpenAI及其CEO阿尔特曼提起诉讼&#xff0c;指控他们违反最初促进AI技术造福人类非营利方向的成立协议。马斯克声称&#xff0c;Ope…

租房招聘平台新篇章:Java+SpringBoot技术革新

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

探索数据结构:深入了解顺序表的奥秘

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元…