Spring Security @PreAuthorize注解分析

 更新时间:2024年11月25日 09:52:12   作者:疯一样的码农  
本教程介绍了如何使用 Spring 方法级安全和 @PreAuthorize 注解来保护 RestController 方法,通过这些步骤,您可以确保只有具有适当角色或权限的用户才能访问特定的 REST API,感兴趣的朋友跟随小编一起看看吧

@PreAuthorize 注解在 Spring Security 中提供了一种声明式的方法,可以在您的 Spring Boot 应用中添加方法级别的安全检查。本教程将引导您设置并有效使用 @PreAuthorize,确保用户只能在具有特定角色或权限的情况下调用 REST API。

什么是 @PreAuthorize?

@PreAuthorize 是 Spring Security 的一个注解,用于指定在方法调用前应评估的表达式,以确定调用者是否有权执行该方法。

将 Spring Security 添加到项目中

确保您的项目中包含 Spring Security。对于 Maven,将以下依赖项添加到 pom.xml 文件中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

对于 Gradle,将以下内容添加到 build.gradle 文件中:

implementation 'org.springframework.boot:spring-boot-starter-security'

启用方法级安全

要在 Spring Boot 应用的 Rest Controller 类中对特定方法应用 Spring Security,必须启用方法级安全。为此,您需要使用 @EnableMethodSecurity 注解。

@Configuration
@EnableMethodSecurity
public class SpringSecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers(HttpMethod.GET, "/api/user").hasRole("USER")
                .requestMatchers(HttpMethod.GET, "/api/admin").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .httpBasic(Customizer.withDefaults());
        return http.build();
    }
    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails ramesh = User.builder()
            .username("ramesh")
            .password(passwordEncoder().encode("password"))
            .roles("USER")
            .build();
        UserDetails admin = User.builder()
            .username("admin")
            .password(passwordEncoder().encode("admin"))
            .roles("ADMIN")
            .build();
        return new InMemoryUserDetailsManager(ramesh, admin);
    }
}

@EnableMethodSecurity 是一个 Spring 注解,用于在 Spring 应用中启用方法级安全。使用此注解后,Spring 将为包含安全方法的类创建代理,并在调用这些方法时拦截以检查调用者是否具有执行方法所需的权限。

此注解与其他注解(如 @PreAuthorize@PostAuthorize@Secured@RolesAllowed)一起工作,这些注解用于指定方法的访问控制规则。例如,您可以使用 @PreAuthorize 指定只有具有特定角色或权限的用户才能调用某个方法;或者使用 @PostAuthorize 指定方法只返回调用者有权查看的数据。

使用 @PreAuthorize 注解保护 REST API

以下代码展示了如何使用 Spring Security 进行基于角色的 RESTful 端点授权。

@RestController
@RequestMapping("/api/")
public class AdminController {
    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/admin")
    public ResponseEntity<String> helloAdmin() {
        return ResponseEntity.ok("Hello Admin");
    }
    @PreAuthorize("hasRole('USER')")
    @GetMapping("/user")
    public ResponseEntity<String> helloUser() {
        return ResponseEntity.ok("Hello User");
    }
}
  • @PreAuthorize("hasRole('ADMIN')"): 应用于 helloAdmin() 方法,表示只有具有 ‘ADMIN’ 角色的用户才能访问此端点。
  • @PreAuthorize("hasRole('USER')"): 应用于 helloUser() 方法,限制只有具有 ‘USER’ 角色的用户才能访问。

总结

本教程介绍了如何使用 Spring 方法级安全和 @PreAuthorize 注解来保护 RestController 方法。通过这些步骤,您可以确保只有具有适当角色或权限的用户才能访问特定的 REST API。

到此这篇关于Spring Security @PreAuthorize注解分析的文章就介绍到这了,更多相关Spring Security @PreAuthorize内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot之控制器的返回值处理方式

    SpringBoot之控制器的返回值处理方式

    这篇文章主要介绍了SpringBoot之控制器的返回值处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring中三种常见Bean的初始化参数机制你了解吗

    Spring中三种常见Bean的初始化参数机制你了解吗

    在Spring框架中,Bean的实例化与初始化是一个复杂的过程,本文我们主要来聊一聊它的常见的三种机制:InitializingBean接口、BeanDefinitionRegistryPostProcessor接口和EnvironmentAware接口,感兴趣的小伙伴可以了解下
    2023-11-11
  • Idea导入多个maven项目到同一目录下的方法示例

    Idea导入多个maven项目到同一目录下的方法示例

    这篇文章主要介绍了Idea导入多个maven项目到同一目录下,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • mybatisplus下划线驼峰转换的问题解决

    mybatisplus下划线驼峰转换的问题解决

    在mybatis-plus中,下划线-驼峰自动转换可能导致带下划线的字段查询结果为null,本文就来介绍一下mybatisplus下划线驼峰转换的问题解决,感兴趣的可以了解一下
    2024-10-10
  • Java找不到或无法加载主类及编码错误问题的解决方案

    Java找不到或无法加载主类及编码错误问题的解决方案

    今天小编就为大家分享一篇关于Java找不到或无法加载主类及编码错误问题的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • springmvc中进行数据保存以及日期参数的保存过程解析

    springmvc中进行数据保存以及日期参数的保存过程解析

    这篇文章主要介绍了springmvc中进行数据保存以及日期参数的保存过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java中springboot搭建html的操作代码

    Java中springboot搭建html的操作代码

    这篇文章主要介绍了Java中springboot搭建html的相关操作,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Intellij IDEA 的maven项目通过Java代码实现Jetty的Http服务器(推荐)

    Intellij IDEA 的maven项目通过Java代码实现Jetty的Http服务器(推荐)

    Jetty是一个轻量级的高度可扩展的基于 java的web服务器和servlet引擎,这篇文章主要介绍了Intellij IDEA 的maven项目通过Java代码实现 Jetty 的 Http服务器从而获取到 Http 的 Get 和 Post 请求,需要的朋友可以参考下
    2022-07-07
  • Java中的注解机制Annotation详解

    Java中的注解机制Annotation详解

    这篇文章主要介绍了Java中的注解机制Annotation详解,  Java Annotation 是 Java 语言中的一种 元数据机制,它可以在代码中添加额外的信息,以便于程序的理解和处理,Annotation 可以用来描述类、方法、属性等各种程序的特性,需要的朋友可以参考下
    2023-10-10
  • SpringMVC通过模型视图ModelAndView渲染视图的实现

    SpringMVC通过模型视图ModelAndView渲染视图的实现

    这篇文章主要介绍了SpringMVC通过模型视图ModelAndView渲染视图的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论