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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决java web应用线上系统偶发宕机的情况

    解决java web应用线上系统偶发宕机的情况

    这篇文章主要介绍了解决java web应用线上系统偶发宕机的情况,具有好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot框架如何管理Xml和CSV

    SpringBoot框架如何管理Xml和CSV

    XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。CSV是一种通用的、相对简单的文件格式,通常被用在大数据领域,进行大规模的数据搬运操作,本文将介绍SpringBoot框架如何管理Xml和CSV
    2021-06-06
  • JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

    JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

    本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有一定的参考价值,需要的朋友可以参考下
    2025-03-03
  • MyBatis Generator介绍及使用方法

    MyBatis Generator介绍及使用方法

    MyBatis Generator 是一款针对 MyBatis 或 iBATIS 设计的代码生成器,由 MyBatis 官方提供,这篇文章主要介绍了MyBatis Generator介绍及使用方法,需要的朋友可以参考下
    2023-06-06
  • 浅析springcloud 整合 zipkin-server 内存日志监控

    浅析springcloud 整合 zipkin-server 内存日志监控

    Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),其主要功能是聚集来自各个异构系统的实时监控数据。这篇文章主要介绍了springcloud 整合 zipkin-server 内存日志监控,需要的朋友可以参考下
    2019-11-11
  • java8使用filter()取出自己所需数据

    java8使用filter()取出自己所需数据

    这篇文章主要介绍了java8使用filter()取出自己所需数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • JDK 1.8 安装配置教程(win7 64bit )

    JDK 1.8 安装配置教程(win7 64bit )

    这篇文章主要为大家详细介绍了win7 64bit下JDK 1.8 安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • java:找不到符号报错的排错方案举例

    java:找不到符号报错的排错方案举例

    当你使用一个未定义或未导入的类时,编译器会报错,下面这篇文章主要给大家介绍了关于java:找不到符号报错的排错方案,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • SpringBoot Web详解静态资源规则与定制化处理

    SpringBoot Web详解静态资源规则与定制化处理

    这篇文章主要介绍了SpringBoot web场景的静态资源规则与定制化,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • 一文掌握Java中List和Set接口的基本使用

    一文掌握Java中List和Set接口的基本使用

    这篇文章主要为大家详细介绍Java中List和Set接口,文中通过示例代码让大家能够轻松掌握List和Set接口的基本使用,感兴趣的可以跟随小编一起学习一下
    2022-07-07

最新评论