SpringSecurity 方法级别权限控制

154 阅读1分钟

方法级别的权限控制

Spring Security 的 @PreAuthorize 注解是方法级权限控制的核心组件,基于 Spring Expression Language(SpEL)实现动态权限校验。

核心功能

  1. 在方法执行前通过SPEL表达式进行权限校验,若表达式结果为false或者抛出异常,则阻止方法执行

使用方式

    @PreAuthorize("@ss.hasPermission('system:user:create')")
    public CommonResult<Long> createUser(UserSaveReqVO reqVO) { .... }
  • @ss : 表示自定义的Bean 名称,在 SecurityConfig 中注册 ,然后在该bean自定义hasPermission方法进行权限校验

演示demo

  1. 新增一个SpringBoot项目
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.5</version>
</parent>
  1. 导入依赖
    <dependencies>
        <!-- Web模块依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Security依赖 -->
        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

3.开启SpringSecurity的方法级别的安全控制@EnableMethodSecurity

@SpringBootApplication
@EnableMethodSecurity
public class ServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);
        System.out.println("启动成功");
    }
}
  1. 自定义校验方法
@Service("ss")
public class SecurityService {
    private static final Logger log = LoggerFactory.getLogger(SecurityService.class);
    public boolean hasPermission(String permission) {
        log.info("Checking permission: {}", permission); // Checking permission: system:user:create
        return false;
    }
}
  1. 定义一个Controller
@RestController
public class UserController {
    @RequestMapping("/")
    @PreAuthorize("@ss.hasPermission('system:user:create')")
    public String hello() {
        return "Hello World";
    }
}
  1. 启动项目,访问http://localhost:8080/ 登录后, 会抛出异常,提示没有权限访问 修改hasPermission返回值为true 即可访问

theme: juejin