SpringSecurity中的@PreAuthorize注解具体介绍与使用

声明

  • 原文地址为:https://blog.csdn.net/weixin_47872288/article/details/135854926

1 . 基本知识

在Java中,@PreAuthorize 是Spring Security框架中的一个注解,用于在方法调用之前对用户的权限进行验证。

允许在方法级别定义访问控制规则,确保只有满足指定条件的用户才能调用该方法

这个注解通常与 Spring 的 AOP(面向切面编程)结合使用,推荐阅读:

  1. Spring框架从入门到学精(全)
  2. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

本身的作用主要如下:

  • 权限控制: 主要用于实现基于方法调用的权限控制,确保只有经过验证的用户才能访问受保护的方法
  • 条件判断: 允许在注解中定义条件表达式,这些表达式决定是否允许方法调用

使用方式:

@PreAuthorize 注解的参数是一个 SpEL(Spring Expression Language)表达式,用于定义权限规则(SpEL支持在表达式中使用各种功能,包括方法调用、条件判断等)

表达式的结果应该是布尔值,如果为 true,则允许方法调用,否则抛出权限异常。
示例:@PreAuthorize("hasRole('ROLE_ADMIN')") 表示只有具有 ROLE_ADMIN 角色的用户可以调用该方法。

除了在方法级别使用 @PreAuthorize,还可以在全局配置中定义方法安全性

通过配置类,指定应用于整个应用程序的全局安全性规则。

2. 使用方式

要么以配置类要么直接使用

2.1 配置类

如果通过配置类的方式:

一般通过继承 WebSecurityConfigurerAdapter 类,通过这个类配置应用程序的安全性

大致的Demo如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // 配置内存中的用户
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER")
            .and()
            .withUser("admin").password("{noop}admin").roles("ADMIN");
    }

    // 配置访问控制规则
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasRole("USER")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
} 

一个是普通用户,一个是管理员。
访问控制规则指定了 /admin/** 路径需要具有 “ADMIN” 角色的用户才能访问
/user/** 路径需要具有 “USER” 角色的用户才能访问
其他请求需要身份验证。登录页面配置为 /login,注销行为允许所有用户。

整体对于配置类来说:

  1. 定义认证规则: 指定用户认证的规则、设置用户的身份验证方式,例如基于内存、数据库、LDAP 等方式,并定义用户的角色和权限

  2. 配置访问控制规则:哪些路径需要身份验证,哪些路径允许匿名访问,哪些路径需要特定的角色或权限

  3. 定制登录和注销行为: 自定义登录页面、处理登录请求的 URL、注销行为等

  4. 启用或禁用特定的安全性功能: 启用或禁用各种安全性功能,例如 CSRF 保护、Session 管理等

2.2 直接使用

内部内置的方法,都在这个类上:

@PreAuthorize 注解内置了一些方便的方法,可以直接在表达式中使用,例如:

  • hasRole('ROLE_NAME') 检查用户是否具有指定角色。
  • hasAnyRole('ROLE1', 'ROLE2') 检查用户是否具有给定角色中的任意一个。
  • hasAuthority('AUTHORITY_NAME') 检查用户是否具有指定权限。
  • hasAnyAuthority('AUTHORITY1', 'AUTHORITY2') 检查用户是否具有给定权限中的任意一个。
  • hasPermission(targetObject, 'permission'): 检查用户是否具有特定对象的特定权限。

如图所示:

对于上述方法的基本细节操作如下:

方法参数传递:

在表达式中,可以引用方法的参数,例如:
@PreAuthorize("hasPermission(#entity, 'read')") 表示检查用户是否有对给定实体的读权限。

逻辑运算:

表达式支持逻辑运算符,如 and, or, not,允许构建更复杂的权限规则

@PreAuthorize("hasRole('ADMIN') and hasPermission(#entity, 'write')")

大致Demo如下:

import org.springframework.security.access.prepost.PreAuthorize;

public class MyService {

    // 示例1: 仅允许具有ROLE_ADMIN角色的用户调用
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public void adminOperation() {
        // 实现管理员操作的代码
    }

    // 示例2: 允许具有READ权限并且是特定用户的调用
    @PreAuthorize("hasPermission(#username, 'READ')")
    public void userOperation(String username) {
        // 实现用户操作的代码
    }
}

@PreAuthorize 注解用于控制方法的访问权限。

  • 只有具有ROLE_ADMIN角色的用户才能调用adminOperation方法
  • 只有具有READ权限并且传入的用户名符合条件的用户才能调用userOperation方法
Spring Boot中,@PreAuthorize注解是用于在方法执行之前进行权限验证的。如果你不想使用@PreAuthorize注解,你可以通过其他方式来实现权限验证。 一种常见的方式是使用Spring Security框架来进行权限验证。Spring Security提供了一套完整的安全认证和授权机制,可以轻松地集成到Spring Boot应用中。 首先,你需要在pom.xml文件中添加Spring Security的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 然后,在你的应用主类上添加@EnableWebSecurity注解,启用Spring Security的功能: ```java import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @EnableWebSecurity public class YourApplication { // ... } ``` 接下来,你可以创建一个继承自WebSecurityConfigurerAdapter的配置类,来配置权限验证规则: ```java import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasAnyRole("ADMIN", "USER") .anyRequest().authenticated() .and() .formLogin(); } } ``` 上述配置中,我们定义了两个URL模式的权限规则:/admin/**需要具有ADMIN角色才能访问,/user/**需要具有ADMIN或USER角色才能访问。其他URL需要进行身份验证。 当你使用Spring Security进行权限验证时,你可以在方法中使用注解来进行更细粒度的权限控制,例如@Secured、@RolesAllowed等。 除了Spring Security,你还可以使用其他的权限验证框架或自定义实现来替代@PreAuthorize注解。这些方式的具体实现方式会根据你的需求和项目架构而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值