当前位置: 首页 > news >正文

【Spring Security + OAuth2】授权

Spring Security + OAuth2

第一章 Spring Security 快速入门
第二章 Spring Security 自定义配置
第三章 Spring Security 前后端分离配置
第四章 Spring Security 身份认证
第五章 Spring Security 授权
第六章 OAuth2


文章目录

  • Spring Security + OAuth2
  • 1、基于request的授权
    • 1.1、用户-权限-资源
      • 需求
      • 配置权限
      • 授权权限
      • 请求未授权的接口
    • 1.2、用户-角色-资源
      • 配置角色
      • 授权角色
    • 1.3、用户-角色-权限-资源
  • 2、基于方法的授权
    • 2.1、开启方法授权
    • 2.2、给用户授予角色和权限
    • 2.3、常用授权注解


授权管理的实现在SpringSecurity中非常灵活,可以帮助应用程序实现以下两种常见的授权需求:

  • 用户-权限-资源:例如张三的权限是添加用户、查看用户列表、李四的权限是查看用户列表
  • 用户-角色-权限-资源:例如张三是角色是管理员、李四的角色是普通用户,管理员能做所有操作,普通用户只能查看信息

1、基于request的授权

1.1、用户-权限-资源

需求

  • 具有USER_LIST权限的用户可以访问/user/list
  • 具有USER_ADD权限的用户可以访问/user/add

配置权限

SecurityFilterChain

package com.security.demo.config;
import ...@Configuration //配置类
public class WebSecurityConfig {@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {// authorizeHttpRequests() 开启授权保护// anyRequest() 对所以请求开启授权保护// authenticated()已认证请求会自动授权。http.authorizeHttpRequests(authorize -> authorize//具有USER_LIST权限的用户可以访问/user/list                   .requestMatchers("/user/list").hasAnyAuthority("USER_LIST")//具有USER_ADD权限的用户可以访问/user/addd.requestMatchers("/user/add").hasAnyAuthority("USER_ADD")//对所有请求开启授权保护.anyRequest()//已认证的请求会被自动授权.authenticated());...
}

授权权限

DBUserDetailsManager中的loadUserByUsername方法:

 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {QueryWrapper<User> queryWrapper = new QueryWrapper();queryWrapper.eq("username",username);User user = userMapper.selectOne(queryWrapper);if (user==null){throw  new UsernameNotFoundException(username);}else{Collection<GrantedAuthority> authorities = new ArrayList<>();//模拟权限authorities.add(()->"USER_LIST");authorities.add(()->"USER_ADD");return   new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),user.getEnabled(),true,//用户账号是否过期。true,//用户凭证是否过期true,//未被锁定authorities//权限列表);}}

请求未授权的接口

实现AccessDeniedHandler 接口

package com.security.demo.config;public class MyAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException, ServletException {//创建结果对象HashMap result = new HashMap();result.put("code",-1);result.put("message","没有权限");//转换成json字符串String json = JSON.toJSONString(result);//返回响应response.setContentType("application/json;charset=UTF-8");response.getWriter().println(json);}
}

SecurityFilterChain添加配置请求未授权的处理。

package com.security.demo.config;
import ...@Configuration //配置类
public class WebSecurityConfig {@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {...http.exceptionHandling(exception -> {exception.accessDeniedHandler(new MyAccessDeniedHandler());//请求未授权的处理});...
}

1.2、用户-角色-资源

配置角色

package com.security.demo.config;
import ...@Configuration //配置类
public class WebSecurityConfig {@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/user/**").hasRole("ADMIN").anyRequest().authenticated());...
}

授权角色

@Component
public class DBUserDetailsManager implements UserDetailsManager, UserDetailsPasswordService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {QueryWrapper<User> queryWrapper = new QueryWrapper();queryWrapper.eq("username",username);User user = userMapper.selectOne(queryWrapper);if (user==null){throw  new UsernameNotFoundException(username);}else{//模拟授权return org.springframework.security.core.userdetails.User.withUsername(user.getUsername()).password(user.getPassword()).disabled(!user.getEnabled())//用户是否禁用.credentialsExpired(false)//是否过期.accountLocked(false).roles("ADMIN").build();}}
}

1.3、用户-角色-权限-资源

RBAC(Role-Based Access Control,基于角色的访问控制)是一种常用的数据设计方案,它将用户的权限分配和管理与角色相关联。以下是一个基本的RBAC数据库设计方案的示例:

1、用户表(User table):包含用户的基本信息,例如用户名、密码和其他身份验证信息。

列名数据类型描述
user_idint用户ID
usernamevarchar用户名
passwordvarchar密码
emailvarchar电子邮件

2、角色表(Role table):储存所有可能得角色及其描述。

列名数据类型描述
role_idint角色ID
role_namevarchar角色名称
descriptionvarchar角色描述

3、权限表(Permission table):定义系统中所有可能得权限

列名数据类型描述
permission_idint权限ID
permission_namevarchar权限名称
descriptionvarchar角色描述

4、用户角色关联表(User-Role table):将用户与角色关联起来。

列名数据类型描述
user_role_idint用户角色关联ID
user_idint用户ID
role_idint角色ID

5、角色权限关联表(Role-Permission table):将角色与权限关联起来。

列名数据类型描述
role_permission_idint用户角色关联ID
role_idint角色ID
permission_idint权限ID

在这个设计方案中,用户可以被分配一个或多个角色,而每个角色又可以具有一个或多个权限。通过对用户角色关联和角色权限关联表进行操作,可以实现灵活的权限管理和访问控制。

2、基于方法的授权

2.1、开启方法授权

在配置文件中添加@EnableMethodSecurity注解,并修改authorizeHttpRequests

@Configuration //配置类
@EnableMethodSecurity
public class WebSecurityConfig {...http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());
}

2.2、给用户授予角色和权限

DBUserDetailsManager中的loadUserByUsername方法:

	 return org.springframework.security.core.userdetails.User.withUsername(user.getUsername()).password(user.getPassword()).disabled(!user.getEnabled())//用户是否禁用.credentialsExpired(false)//是否过期.accountLocked(false).roles("ADMIN")//authorities和roles不能同时使用会覆盖.authorities("USER_ADD","USER_LIST").build();}

2.3、常用授权注解

    @GetMapping(path = "/list")@PreAuthorize("hasRole('ADMIN') and authentication.name == 'abc'")public List<User> getList(){return userService.list();}@PreAuthorize("hasAuthority('USER_ADD')")@PostMapping(path = "/add")public void add(@RequestBody User user){userService.saveUserDetails(user);}

相关文章:

【Spring Security + OAuth2】授权

Spring Security OAuth2 第一章 Spring Security 快速入门 第二章 Spring Security 自定义配置 第三章 Spring Security 前后端分离配置 第四章 Spring Security 身份认证 第五章 Spring Security 授权 第六章 OAuth2 文章目录 Spring Security OAuth21、基于request的授权1…...

失落的方舟台服预下载教程 一键下载+账号注册教程

失落的方舟台服预下载教程 一键下载&#xff0b;账号注册教程 是一款今年备受瞩目的游戏&#xff0c;将于5月30日正式上线&#xff0c;这款游戏搭建在虚幻引擎的基础上&#xff0c;为玩家们带来了极佳的视觉体验。这款游戏秉承着MMO类型游戏一贯的玩法&#xff0c;但是制作组在…...

【启明智显技术分享】SOM2D02-2GW核心板适配ALSA(适用Sigmastar ssd201/202D)

提示&#xff1a;作为Espressif&#xff08;乐鑫科技&#xff09;大中华区合作伙伴及sigmastar&#xff08;厦门星宸&#xff09;VAD合作伙伴&#xff0c;我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考。同时也用心整理了乐鑫及星宸…...

人工智能的发展现状,AI将如何改变IT行业,哪些职业将最先失业

文章目录 一、人工智能的发展现状1、技术进展与突破2、商业应用与市场3、挑战与问题4、未来趋势 二、AI将如何改变IT行业1、工作方式的转变&#xff1a;2、未来发展的推动&#xff1a;3、用户服务和体验的提升&#xff1a;4、创新和转型的推动&#xff1a;5、融入日常生活和工作…...

request.js使用Promise.all等待所有请求完成再进行数据赋值

在JavaScript中&#xff0c;使用request.js发送多个并发请求&#xff0c;并使用Promise.all来处理这些请求的结果可以通过以下方式实现&#xff1a; 首先&#xff0c;确保你已经安装了request.js&#xff0c;如果没有&#xff0c;可以通过npm安装&#xff1a; npm install re…...

Java开发者必知的时间处理工具:SimpleDateFormat类详解

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…...

构造函数的用法

c 子类构造函数初始化及父类构造初始化_构造函数对父类进行初始化-CSDN博客...

环形链表Ⅱ-力扣

第一种解法时哈希表&#xff0c;set在使用insert插入时&#xff0c;会返回一个pair&#xff0c;如果pair的值为0&#xff0c;则插入失败&#xff0c;那么返回这个插入失败的节点&#xff0c;就是入环的第一个节点&#xff0c;代码如下&#xff1a; /*** Definition for singly…...

【microros】解决 microros安装过程中的 undefined reference to `fmt::v6 问题

目录 问题解决方案参考链接 问题 在 ubuntu-20 arm 开发板上根据官方文档手动编译安装 microros 过程中&#xff0c;执行 ros2 run micro_ros_setup build_agent.sh 命令时&#xff0c;遇到了 undefined reference to fmt::v6 的问题&#xff0c;大概报错如下&#xff1a; Yo…...

29. 相似矩阵,若尔当型

文章目录 1. 相似矩阵1.1 A T A A^TA ATA正定性证明 2. 相似矩阵2.1 举例2.2 证明相似矩阵具有相同特征值 1. 相似矩阵 假设矩阵A&#xff0c;B为正定矩阵&#xff0c;那么对于任意非零列向量x来说&#xff0c;二次型 x T A x , x T B x x^TAx,x^TBx xTAx,xTBx恒为正 x T A …...

【论文阅读】 YOLOv10: Real-Time End-to-End Object Detection

文章目录 AbstractIntroductionRelated WorkMethodologyConsistent Dual Assignments for NMS-free Training &#xff08;无NMS训练的一致性双重任务分配&#xff09;Holistic Efficiency-Accuracy Driven Model Design &#xff08;效率-精度驱动的整体模型设计&#xff09; …...

Python读写文件

最近得以空闲&#xff0c;然后继续学习py。 学习一下py中最频繁用到的文件读写的方法。 在py中&#xff0c;操作是通过文件对象【File obj】实现的&#xff0c;通过文件对象可以读写文本文件和一些二进制文件。 1.打开文件 使用Python中的open函数。有8个参数&#xff0c;但…...

docker-如何将容器外的脚本放入容器内,将容器内的脚本放入容器外

文章目录 前言docker-如何将容器外的脚本放入容器内&#xff0c;将容器内的脚本放入容器外、1. docker 如何将容器外的脚本放入容器内1.1. 验证 2. 将容器内的脚本放入容器外 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&…...

算法训练营第三十九天 | LeetCode 738 单调递增的数字、LeetCode 968 监控二叉树

LeetCode 738 单调递增的数字 这题类似模拟&#xff0c;可以找出如下规律&#xff1a; 先将数字按位数从高位到低位存到一个整型数组中。在这个数组中&#xff0c;从左往右遍历&#xff0c;如果遇到一个两数相等&#xff0c;并且记录的这个变量之前没有赋过值&#xff0c;那么…...

Hive语法学习总结

Hive SQL语法学习总结 hive参数库操作1.创建库2.具体案例3.库的其他操作 表和库的路径演示表的操作创建表插入数据 hive参数 一 hive常用交互命令hive -e sql语句hive -f sql文件 //文件中是sql语句二 参数的设置方式一&#xff1a;在客户端中设置参数(当次有效)set 参数名参…...

【Linux】TCP协议【中】{确认应答机制/超时重传机制/连接管理机制}

文章目录 1.确认应答机制2.超时重传机制&#xff1a;超时不一定是真超时了3.连接管理机制 1.确认应答机制 TCP协议中的确认应答机制是确保数据可靠传输的关键部分。以下是该机制的主要步骤和特点的详细解释&#xff1a; 数据分段与发送&#xff1a; 发送方将要发送的数据分成一…...

solidworks画螺母学习笔记

螺母 单位mm 六边形 直径16mm&#xff0c;水平约束&#xff0c;内圆直径10mm 拉伸 选择两侧对称&#xff0c;厚度7mm 拉伸切除 画相切圆 切除深度7mm&#xff0c;反向切除 拔模角度45 镜像切除 倒角 直径1mm 异形孔向导 螺纹线 偏移打勾&#xff0c;距离为2mm…...

WebGL的医学培训软件开发

开发基于WebGL的医学培训软件是一项复杂且技术性强的任务&#xff0c;需要结合医学专业知识和计算机图形学技术。以下是详细的开发流程和关键步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析与定义 目标用户&#xf…...

新时代AI浪潮下,程序员和产品经理如何入局AIGC领域?

当下&#xff0c;AI浪潮席卷全球&#xff0c;AIGC大模型技术已经成为当今技术领域的一个重要趋势&#xff0c;对于产品经理来说&#xff0c;掌握这项技术不仅能够增强他们的职业技能&#xff0c;还能在竞争激烈的职场中脱颖而出。 为什么呢&#xff1f; 把握AI时代的机遇 AI技…...

OWASP top10--SQL注入(一)

SQL注入式攻击技术&#xff0c;一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因&#xff0c;是由于程序员在编写Web程序时&#xff0c;没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数&#xff0c;提交SQL查询语句&#xff0c;并传递至服务器端…...

三个角度分析AI自动写文+自动发布自媒体矩阵提效实测

搞自媒体干久了&#xff0c;有谁没动过心思琢磨能不能让机器来帮忙写、帮忙发&#xff1f;尤其是你手头上攥着五六个账号&#xff0c;天天瞅着不同平台的规则、排版、发布时间的安排&#xff0c;脑袋都快给弄炸。最近我试了这么一个流程&#xff1a;用人工智能自动去写文章然后…...

.NET源码生成器基于partial范式开发和nuget打包塘

1 安装与初始化 # 全局安装 OpenSpec npm install -g fission-ai/openspeclatest # 在项目目录下初始化 cd /path/to/your-project openspec init 初始化时&#xff0c;OpenSpec 会提示你选择使用的 AI 工具&#xff08;Claude Code、Cursor、Trae、Qoder 等&#xff09;。 3 O…...

Scio REPL交互式编程:快速原型开发和数据分析的终极指南

Scio REPL交互式编程&#xff1a;快速原型开发和数据分析的终极指南 【免费下载链接】scio A Scala API for Apache Beam and Google Cloud Dataflow. 项目地址: https://gitcode.com/gh_mirrors/sc/scio Scio REPL交互式编程是Apache Beam和Google Cloud Dataflow的Sca…...

TSPR-AI概率化递推引擎与跨端智能生态构建

TSPR-AI概率化递推引擎与跨端智能生态构建文档版本&#xff1a;V2.0 发布日期&#xff1a;2026年4月9日 所属机构&#xff1a;拓世网络技术开发工作室&#xff08;陕西省渭南市临渭区&#xff09;摘要本文档旨在阐述拓世网络技术开发工作室自研的全栈式AI内容工程与跨端智能技术…...

不做产品,只做 Token 中转——卖 Token 到底怎么赚钱

&#x1f4a1; 本文是「小龙虾搞钱指南」系列第 4 篇。前两篇拆了 Polymarket 交易 Bot 和 Skill 经济变现 以及用 ai 实现股票快速跟踪&#xff0c;这篇聊一个更底层的生意——帮别人调 AI 的"中间商"&#xff0c;是怎么赚到钱的。有个平台叫 OpenRouter。它不需要花…...

如何快速上手 Plus Jakarta Sans:面向新手的完整实践指南

如何快速上手 Plus Jakarta Sans&#xff1a;面向新手的完整实践指南 【免费下载链接】PlusJakartaSans Jakarta Sans is a open-source fonts. Designed for Jakarta "City of collaboration" program in 2020. 项目地址: https://gitcode.com/gh_mirrors/pl/Plus…...

OpenClaw版本升级指南:Qwen3-14b_int4_awq兼容性检查清单

OpenClaw版本升级指南&#xff1a;Qwen3-14b_int4_awq兼容性检查清单 1. 为什么需要这份升级指南 上周五晚上11点&#xff0c;我的OpenClaw突然罢工了——当时它正在帮我自动整理会议纪要&#xff0c;突然弹出一条错误提示&#xff1a;"Model provider configuration in…...

OpenStack中cinder-volume服务异常排查与时间同步修复指南

1. 当cinder-volume服务突然罢工时 最近在维护OpenStack集群时&#xff0c;遇到一个挺典型的问题&#xff1a;cinder-volume服务状态突然变成了down。这直接导致云平台上的块存储功能无法正常使用&#xff0c;虚拟机创建、卷挂载等操作都受到了影响。经过排查&#xff0c;发现问…...

微信聊天记录永久保存的3种方法:WeChatMsg完整指南与实战技巧

微信聊天记录永久保存的3种方法&#xff1a;WeChatMsg完整指南与实战技巧 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/w…...

​从散户到 “跟庄” | 职业交易者的聪明金钱心法 :看结构、抓流动性,提高胜率!​

从散户到 “跟庄” | 职业交易者的聪明金钱心法 :看结构、抓流动性,提高胜率! 聪明金钱概念是交易中能帮你建立巨大盈利优势的核心逻辑——它能让你看透价格走势的本质,精准找到高盈亏比入场点,而不是被表面波动牵着走。 今天就把聪明金钱的核心逻辑、实战方法和交易设置…...