方法级别的权限控制
Spring Security 的 @PreAuthorize 注解是方法级权限控制的核心组件,基于 Spring Expression Language(SpEL)实现动态权限校验。
核心功能
- 在方法执行前通过SPEL表达式进行权限校验,若表达式结果为false或者抛出异常,则阻止方法执行
使用方式
@PreAuthorize("@ss.hasPermission('system:user:create')")
public CommonResult<Long> createUser(UserSaveReqVO reqVO) { .... }
- @ss : 表示自定义的Bean 名称,在 SecurityConfig 中注册 ,然后在该bean自定义hasPermission方法进行权限校验
演示demo
- 新增一个SpringBoot项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
</parent>
- 导入依赖
<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("启动成功");
}
}
- 自定义校验方法
@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;
}
}
- 定义一个Controller
@RestController
public class UserController {
@RequestMapping("/")
@PreAuthorize("@ss.hasPermission('system:user:create')")
public String hello() {
return "Hello World";
}
}
- 启动项目,访问
http://localhost:8080/登录后, 会抛出异常,提示没有权限访问 修改hasPermission返回值为true 即可访问