【SpringBoot3】Spring Security 常用注解

注:本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1

一、Spring Security 常用注解

Spring Security 6 的常用注解包括以下几种,通过这些注解可以更加方便的控制资源权限。

  • @Secured :方法执行前检查,直接判断有没有对应的角色
  • @PreAuthorize:方法执行前检查,根据SpEL表达式执行结果判断是否授权
  • @PostAuthorize:方法执行后检查,根据SpEL表达式执行结果判断是否授权

要使用以前注解必须增加配置,开启校验功能

// 用于启用方法级别的安全支持
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)

@Secured

方法执行前检查,直接判断有没有对应的角色

示例代码:

@Secured({ "ROLE_USER" })
public void create(Contact contact);@Secured({ "ROLE_USER", "ROLE_ADMIN" })
public void update(Contact contact);@Secured({ "ROLE_ADMIN" })
public void delete(Contact contact);

@PreAuthorize

方法执行前检查,根据SpEL表达式执行结果判断是否授权

示例代码:

// 有角色
@PreAuthorize("hasRole('ROLE_ADMIN')")
// 有任一角色
@PreAuthorize("hasAnyRole({'ROLE_USER','ROLE_ADMIN'})")
// 有任一权限
@PreAuthorize("hasAnyAuthority({'user:search','user:edit'})")

@PreAuthorize配合使用的方法定义在 org.springframework.security.access.expression.SecurityExpressionOperations

在这里插入图片描述

二、完整代码示例

1、HttpSecurity 配置

@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class BasicSecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authorize) -> authorize// 放行登录页面.requestMatchers("/login").permitAll()// 拦截其他所有请求.anyRequest().authenticated())// 退出时,让session失效.logout(logout -> logout.invalidateHttpSession(true))// 配置登录页面 和 登录成功后页面.formLogin(form -> form.loginPage("/login").permitAll().loginProcessingUrl("/login").defaultSuccessUrl("/index"));http.exceptionHandling(e->e.accessDeniedPage("/noAuth"));// 开启csrf 保护http.csrf(Customizer.withDefaults());return http.build();}@Beanpublic UserDetailsService userDetailsService() {UserDetails user1 = User.withUsername("admin").password("{noop}123456").roles("ADMIN").build();UserDetails user2 = User.withUsername("user").password("{noop}123456").authorities("user:edit","ROLE_USER").build();return new InMemoryUserDetailsManager(user1,user2);}@Beanpublic PasswordEncoder passwordEncoder() {return PasswordEncoderFactories.createDelegatingPasswordEncoder();}}

2、测试controller类,DemoController

import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@GetMapping("/admin")@Secured({"ROLE_ADMIN"})public String admin() {return "Hello admin";}@GetMapping("/user")@Secured({"ROLE_ADMIN","ROLE_USER"})public String user() {return "Hello user";}@GetMapping("/admin2")@PreAuthorize("hasRole('ROLE_ADMIN')")public String admin2() {return "Hello admin";}@GetMapping("/user2")@PreAuthorize("hasAnyRole({'ROLE_USER','ROLE_ADMIN'})")public String user2() {return "Hello user";}@GetMapping("/user_perm")@PreAuthorize("hasAnyAuthority({'user:search','user:edit'})")public String user_perm() {return "Hello user";}@RequestMapping("/all")public String all() {return "Hello all";}}

如果需要自定义认证和授权逻辑,可以实现 UserDetailsService 和 AuthenticationProvider 接口,并在配置类中注入这些自定义的 Bean。

这就是 Spring Security 的注解验证流程。通过合理地使用注解和配置类,可以轻松地实现基于角色的访问控制、方法级别的授权等安全功能。同时,Spring Security 还提供了丰富的扩展点,允许开发者根据具体需求进行定制。

三、Spring Security 常见扩展点

Spring Security 提供了许多扩展点,允许开发者根据具体需求进行定制和扩展。以下是一些常见的扩展点:

  1. 过滤器链(Filter Chain)
    Spring Security 本质是一个过滤器链,开发者可以通过自定义过滤器来扩展其功能。例如,可以添加自定义的认证过滤器、授权过滤器或会话管理过滤器等。

  2. 认证机制(Authentication Mechanism)
    可以自定义认证机制,包括用户信息的加载、密码的编码和校验等。通过实现 AuthenticationProvider 接口,可以定义自己的认证逻辑。

  3. 授权决策(Authorization Decision)
    开发者可以通过实现 AccessDecisionManager 接口来自定义授权决策逻辑。这允许你根据业务逻辑来定制权限判断。

  4. 用户服务(User Service)
    通过实现 UserDetailsService 接口,可以自定义用户信息的加载方式。例如,你可以从数据库、LDAP 服务器或其他数据源中获取用户信息。

  5. 安全事件监听(Security Event Listeners)
    Spring Security 提供了安全事件监听器,允许你监听认证、授权等事件,并根据事件执行相应的操作。

  6. 方法安全(Method Security)
    除了使用注解外,你还可以通过配置 GlobalMethodSecurityConfiguration 来全局启用方法级别的安全支持,并自定义方法安全的配置。

  7. 安全表达式语言(Security Expression Language)
    Spring Security 使用了强大的安全表达式语言(SpEL),允许你在注解和配置中使用表达式来定义复杂的权限和角色要求。

  8. 会话管理(Session Management)
    可以自定义会话的创建、存储、失效等逻辑,以满足特定的业务需求。

  9. HTTP 安全配置(HTTP Security Configuration)
    通过重写 configure(HttpSecurity http) 方法,你可以自定义 HTTP 安全配置,包括 CSRF 保护、点击劫持保护、缓存控制等。

  10. 异常处理(Exception Handling)
    可以自定义认证和授权失败时的异常处理逻辑,例如返回自定义的错误页面或错误信息。

这些扩展点使得 Spring Security 非常灵活,能够适应各种不同的安全需求。通过合理利用这些扩展点,开发者可以构建出强大而安全的应用程序。

参考

  • https://docs.spring.io/spring-security/reference/index.html

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

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

相关文章

linux高级作业

作业需求 1、openEuler 二进制方式安装MySQL 8.0.x。 二、备份数据库 3.备份数据库school到/backup目录 4.备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库 5.直接将MySQL数据库压缩备份 第一题 1、openEuler 二进制方式…

大端模式和小端模式的区别

参考文章 https://blog.csdn.net/weixin_44057803/article/details/130670865 一、为什么会有大小端之分? 这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的…

合理利用pandas来简化大量请求数据组装工作

工作场景 本次我们开发了一个新功能,为了验证它是否合理,我们需要从线上导出一批真实的用户数据来进行模拟请求,以此来验证功能的完整性。 例如一个很简单的功能,我们是一个对学生成绩进行数据分析的系统,各学校会将…

Jmeter的自动化测试实施方案(超详细)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,涨薪更快 Jmeter是目前最流行的一种测试工具,基于此工…

OpenAI 发布文生视频大模型 Sora,AI 视频要变天了,视频创作重新洗牌!AGI 还远吗?

一、一觉醒来,AI 视频已变天 早上一觉醒来,群里和朋友圈又被刷屏了。 今年开年 AI 界最大的震撼事件:OpenAI 发布了他们的文生视频大模型 Sora。 OpenAI 文生视频大模型 Sora 的横空出世,预示着 AI 视频要变天了,视…

柚见(伙伴匹配系统)第六期

开发主页 开发主页(默认推荐和自己兴趣相当的用户)优化主页的性能(缓存 定时任务 分布式锁) 前端recommend 最简单:直接 list 列表 cv searchResult页面的代码 修改 后端接口 数据内容下边距修改 提取用户信息卡…

11. Springboot集成Dubbo3(二)示例demo

目录 1、前言 2、注册中心 3、快速开始 3.1、添加dubbo3依赖 3.2、dubbo3-api ​编辑 3.3、dubbo3-server 3.3.1、添加依赖 3.3.2、实现IUserService 3.3.3、添加配置文件application.properties 3.3.4、修改Application启动类 3.3.5、出错解决 3.4、dubbo3-porta…

Android widget基础指南

widget的概念最早是由一名叫Rose的苹果工程师提出,后来经过多方面机缘巧合的发展下,便有了今天Android平台上的小组件widget,一般APP开发可能应用场景较少,最常见的莫过于天气APP的widget。但对于从事IOT或车载方向的同学&#xf…

【机器学习笔记】13 降维

降维概述 维数灾难 维数灾难(Curse of Dimensionality):通常是指在涉及到向量的计算的问题中,随着维数的增加,计算量呈指数倍增长的一种现象。在很多机器学习问题中,训练集中的每条数据经常伴随着上千、甚至上万个特征。要处理这…

SpringMVC 的参数绑定之list集合、Map

标签中name属性的值就是pojo类的属性名 参数绑定4 list [对象] <form action"teaupd.do" method"post"> <c:forEach items"${list}" var"tea" varStatus "status"> 教师编号&#xff1a;<input…

微信小程序开发:appid和secret的获取方法

首先进入小程序官网 - 微信公众平台&#xff1a;https://mp.weixin.qq.com 在开发管理页即可查看 AppID。 AppSecret 需要点击生成&#xff0c;手机扫码后查看。 内容拓展&#xff1a; 当开发微信小程序时&#xff0c;了解和正确使用 AppID 和 AppSecret 是至关重要的。以…

更快找到远程/自由工作的网站

不要使用Fiver或Upwork。 它们已经饱和了。 下面是10个更快找到远程/自由工作的网站&#xff1a; 1. Toptal 这个网站专门为熟练的自由职业者提供远程工作机会&#xff0c;如Shopify和Priceline等一流公司。 他们只接受软件开发、设计和金融等领域的顶级3%自由职业者。 htt…