使用Spring Security实现用户-角色-资源的权限控制

文章目录

    • 一、基于角色的请求控制
    • 二、加载用户角色信息
    • 三、角色与资源的关联
    • 四、测试角色权限控制
      • 1. 未登录用户访问受保护资源
      • 2. 登录用户访问受保护资源
      • 3. 角色不足的用户访问受保护资源(把前面改成.roles("USER"))
    • 五、自定义异常处理
      • 1. 自定义未授权处理器
      • 2. 注册自定义异常处理器
    • 六、总结

在Web应用的开发中,权限管理是必不可少的一环。继上次分享了基于 用户-权限-资源的权限控制后,这次我们来探讨如何通过Spring Security实现 用户-角色-资源的权限管理。

一、基于角色的请求控制

首先,我们需要根据不同的资源路径设置相应的角色要求。以下是安全配置的代码:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {// 开启授权保护http.authorizeHttpRequests(authorize -> authorize// 所有 /user/** 路径下的请求需要 ADMIN 角色.requestMatchers("/user/**").hasRole("ADMIN")// 对所有请求开启授权保护.anyRequest()// 已认证的请求自动被授权.authenticated());// 其他配置省略...
}

在这段代码中,我们通过hasRole("ADMIN")方法,指定访问/user/**路径的请求需要具备ADMIN角色。这样,我们就实现了基于角色的资源访问控制。

二、加载用户角色信息

接下来,我们需要为用户加载其对应的角色信息。在Spring Security中,可以通过实现UserDetailsService接口的loadUserByUsername方法:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(User::getUsername, username);User user = userMapper.selectOne(lambdaQueryWrapper);if (user == null) {throw new UsernameNotFoundException(username);} else {return org.springframework.security.core.userdetails.User.withUsername(user.getUsername()).password(user.getPassword()).disabled(!user.getEnabled())// 设置用户的凭据是否过期,false 表示凭据未过期.credentialsExpired(false)// 设置账户是否被锁定,false 表示账户未锁定.accountLocked(false)// 为用户分配 ADMIN 角色.roles("ADMIN").build();}
}

在这个方法中,我们:

  1. 从数据库中根据用户名查询用户信息。
  2. 如果用户存在,使用User.withUsername()方法构建一个UserDetails对象。
  3. 通过.roles("ADMIN")方法为用户分配ADMIN角色。

需要注意的是,Spring Security在处理角色时,会自动为角色名添加"ROLE_"前缀。因此,"ADMIN"角色实际上对应权限"ROLE_ADMIN"

三、角色与资源的关联

通过上述配置,我们实现了以下功能:

  • 用户:通过数据库加载,包含用户名、密码、是否启用等信息。
  • 角色:为用户分配特定的角色,例如ADMIN
  • 资源:指定哪些URL路径需要哪些角色才能访问。

当用户尝试访问受保护的资源时,Spring Security会根据用户的角色信息决定是否授权。

四、测试角色权限控制

以下是一些测试场景,帮助验证我们的权限控制是否正确。

1. 未登录用户访问受保护资源

当未登录的用户尝试访问/user/list时,会被重定向到登录页面,提示需要先进行身份认证。

image-20241008162750204

2. 登录用户访问受保护资源

使用具备ADMIN角色的用户登录后,尝试访问/user/list,应当能够正常访问。

image-20241008162040000

3. 角色不足的用户访问受保护资源(把前面改成.roles(“USER”))

如果登录的用户没有ADMIN角色,尝试访问/user/list时,会收到权限不足的提示,无法访问该资源。

image-20241008162212811

五、自定义异常处理

为了提升用户体验,我们可以自定义异常处理器,返回统一的JSON格式错误信息。

1. 自定义未授权处理器

public class MyAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response,AccessDeniedException accessDeniedException) throws IOException, ServletException {// 创建结果对象HashMap<String, Object> 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);}
}

2. 注册自定义异常处理器

http.exceptionHandling(exception -> {// 请求未认证的处理exception.authenticationEntryPoint(new MyAuthenticationEntryPoint());// 请求未授权的处理exception.accessDeniedHandler(new MyAccessDeniedHandler());
});

通过上述配置,当用户没有权限访问某个资源时,会返回自定义的JSON错误信息,方便前端进行处理。

六、总结

通过以上步骤,我们实现了基于用户-角色-资源的权限控制:

  • 用户:通过UserDetailsService加载用户信息,并为其分配ADMIN角色。
  • 角色:使用.roles("ADMIN")方法为用户指定角色。
  • 资源:通过requestMatchers("/user/**").hasRole("ADMIN")指定需要ADMIN角色才能访问的资源。

这种方式的优势在于:

  • 管理方便:角色可以包含多个权限,简化了权限管理的复杂度。
  • 灵活性高:可以根据需要动态调整用户的角色,进而控制其访问权限。

在实际项目中,通常会有一个角色和权限的对应关系表,角色下包含多个权限,用户可以被分配一个或多个角色。

希望这篇文章能对大家在权限管理的实践中有所帮助。如果有任何疑问或建议,欢迎在评论区留言讨论!

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

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

相关文章

数学建模算法与应用 第3章 非线性规划及其求解方法

目录 3.1 非线性规划概述 3.2 约束优化问题 3.3 无约束优化问题的Matlab求解 3.4 牛顿法与梯度下降法 Matlab代码示例&#xff1a;梯度下降法求解简单非线性问题 3.5 非线性规划在机器学习中的应用 习题 3 总结 非线性规划&#xff08;Nonlinear Programming, NLP&…

华为OD机试 - 人数最多的站点(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

A2P云短信,是什么意思?

中国联通国际公司产品之 A2P 云短信 一站式国际通信服务&#xff0c;助力企业拓展国际业务&#xff0c;轻松触达全球客户 在全球化日益加深的今天&#xff0c;企业要想在竞争激烈的国际市场中脱颖而出&#xff0c;不仅需要优质的产品和服务&#xff0c;更需要高效的沟通渠道来…

系统架构设计师 - 案例特训专题 - 架构设计篇

案例特训专题 - 架构设计篇 架构设计篇软件架构风格 ★★★★质量属性与架构评估 ★★★★★Web 架构综合考查 ★★★★★单台机器到数据库与Web服务器分离应用服务器集群负载均衡技术Session共享机制持久化技术 ORM数据库读写分离化缓存常见缓存技术Redis 集群切片的常见方式R…

DAMA数据管理知识体系(第5章 数据建模和设计)

课本内容 5.1 引言 概要 常见6种数据模式 关系模式多维模式面向对象模式事实模式时间序列模式NoSQL模式按照描述详细程度不同分类 概念模型逻辑模型物理模型包含组件 实体、关系、事实、键、属性业务驱动因素 1&#xff09;提供有关数据的通用词汇表。2&#xff09;获取、记录组…

SQL Server 2022 RTM Cumulative Update #15 发布下载

SQL Server 2022 RTM Cumulative Update #15 发布下载 最新的累积更新 (CU) 下载&#xff0c;包含自 SQL Server 2022 RTM 发布以来的所有更新。 请访问原文链接&#xff1a;https://sysin.org/blog/sql-server-2022/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留…

职称申报材料整理需要注意哪些方面呢?

相信不少小伙伴都想评完职称&#xff0c;最后可以升职加薪领补贴等等&#xff0c;但是不知道申请具体需要哪些材料❓❗ 今天甘建二给大家整理出20个工程专业职称评审的必备材料&#xff0c;必须码住&#xff0c;千万别错过啦 &#xfffd;&#xfffd;01、业绩材料 ⭕反应任现…

PCL 计算点云AABB包围盒

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 计算AABB 2.1.2 可视化AABB 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09;…

ChatGPT国内中文版镜像网站整理合集(2024/9/30)

一、GPT中文镜像站 ① yixiaai.com 支持GPT4、4o以及o1&#xff0c;支持MJ绘画 ② chat.lify.vip 支持通用全模型&#xff0c;支持文件读取、插件、绘画、AIPPT ③ AI Chat 支持GPT3.5/4&#xff0c;4o以及MJ绘画 1. 什么是镜像站 镜像站&#xff08;Mirror Site&#xff…

如何实现不同VLAN间互通?

问题描述 客户要求不同VLAN的PC机互通&#xff0c;如下图拓扑所示。 此外&#xff0c;仅允许在设备 LSW3 上进行配置修改。 分析 由于所有的PC都在同一个网段&#xff0c;当任何一个设备想要和另一个设备通信时&#xff0c;它会首先根据数据交互的流程广播一个ARP请求报文来获…

微服务架构Gin-etcd-gRPC接合的入门实践

最近在学习微服务&#xff0c;先后学习gRPC、etcd。学习过这两个技术之后&#xff0c;结合Gin框架&#xff0c;简单实现了一个微服务的小demo了。 以下是各技术在微服务架构中的功能。 Gin框架作为网关&#xff0c;外部请求的统一出口。负责将外部的HTTP请求转化为RPC请求&…

量子数字签名概述

我们都知道&#xff0c;基于量子力学原理研究密钥生成和使用的学科称为量子密码学。其内容包括了量子密钥分发、量子秘密共享、量子指纹识别、量子比特承诺、量子货币、秘密通信扩展量子密钥、量子安全计算、量子数字签名、量子隐性传态等。虽然各种技术发展的状态不同&#xf…

YOLOv8实战TT100K中国交通标志检测【数据集+YOLOv8模型+源码+PyQt5界面】

YOLOv8实战TT100k交通标志识别 文章目录 研究背景资源获取1.前言1.1 YOLO 系列&#xff1a;中国交通标志检测领域的璀璨明星1.2 Transformer与注意力机制&#xff1a;为中国交通标志检测注入新活力1.3 中国交通标志检测技术&#xff1a;迎接挑战&#xff0c;砥砺前行1.4 YOLOv8…

『网络游戏』协程回调事件实现Tips弹窗【09】

创建脚本&#xff1a;DynamicWnd.cs 编写脚本&#xff1a;DynamicWnd.cs 修改脚本&#xff1a;WindowRoot.cs - 适配修改错误 修改脚本&#xff1a;GameRoot.cs 拖拽框选 运行项目 - 显示Tips弹窗 本章结束

3.C语言入门:解锁基础概念,动手实现首个C程序

C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序 文章目录 C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序前言一、源文件和头文件1.1 如何新建项目1.2 添加头文件和源文件 二、第一个C语言程序1.创建一个源文件2.写代码3.运行代码 三、mai…

水库大坝安全监测预警系统守护大坝安全卫士

一、系统背景 近年来&#xff0c;受全球气候变化和人类活动影响&#xff0c;极端天气发生频度强度增加&#xff0c;加之我国城市化进程中&#xff0c;水库下游人口聚集、基础设施密集&#xff0c;对水库工程安全运行提出了新的更高要求。“十四五”以来我国建成并投入使用37593…

微服务架构---认识Zuul

目录 认识Zuul简单的例子 第一个Zuul程序步骤1&#xff1a;创建父工程zuul-1步骤2&#xff1a;创建HystrixController类步骤3&#xff1a;搭建服务消费者eureka-consumer项目&#xff08;1&#xff09;创建一个config包&#xff0c;在config包下新建配置类RestConfig&#xff0…

跨境卖家品牌出海要注意哪些方面

随着目前互联网的发展&#xff0c;市场由线下扩张到全国&#xff0c;再扩张到了全球&#xff0c;但是海外市场和国内并不相同跨境卖家品牌想要出海&#xff0c;需要注意多个方面&#xff0c;以确保能够在国际市场上成功立足并发展。以下是一些关键点&#xff1a; 首先想得拥有…

基于matlab的语音信号处理

摘要 利用所学习的数字信号处理知识&#xff0c;设计了一个有趣的音效处理系统&#xff0c;首先设计了几种不同的滤波器对声音进行滤波处理&#xff0c;分析了时域和频域的变化&#xff0c;比较了经过滤波处理后的声音与原来的声音有何变化。同时设计实现了语音的倒放&#xf…

【HarmonyOS开发笔记 2 】 -- ArkTS语法中的变量与常量

ArkTS是HarmonyOS开发的编程语言 ArkTS语法中的变量 【语法格式】&#xff1a; let 变量名: 类型 值 let&#xff1a;是定义变量的关键字类型&#xff1a; 值数据类型&#xff0c; 常用的数据类型 字符型&#xff08;string&#xff09;、数字型&#xff08;number&#xf…