Spring Security提供了多种配置授权规则的方法,以下是一些常见的方法:
1. 基于URL的授权
这是最简单、最常用的方法。可以使用 antMatchers() 方法匹配特定URL模式,并指定该模式下所需的权限。例如:
Java
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**")
.hasRole("ADMIN") // 只有拥有 "ADMIN" 角色的用户才能访问 /admin/** 下的所有URL
.antMatchers("/user/**")
.hasRole("USER") // 只有拥有 "USER" 角色的用户才能访问 /user/** 下的所有URL
.antMatchers("/public/**")
.permitAll() // 任何用户都可以访问 /public/** 下的所有URL
.anyRequest()
.authenticated(); // 任何其他请求都需要经过身份验证
}
2. 基于方法的授权
可以使用 Spring Security 提供的注解在方法级别上配置授权规则。例如:
Java
@Controller
public class MyController {
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String admin() {
// ...
}
@PreAuthorize("hasRole('USER')")
@GetMapping("/user")
public String user() {
// ...
}
}
3. 基于表达式的授权
可以使用 SpEL 表达式在授权规则中定义更复杂的逻辑。例如:
Java
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/products/**")
.access("hasPermission(#request.object, 'read')") // 只有拥有对传入对象的读取权限的用户才能访问 /products/** 下的所有URL
.antMatchers("/orders/**")
.access("hasPermission(#request.object, 'write') and hasRole('ADMIN')") // 只有拥有对传入对象的写入权限并且拥有 "ADMIN" 角色的用户才能访问 /orders/** 下的所有URL
.anyRequest()
.authenticated();
}
4. 自定义授权器
如果需要更复杂的授权逻辑,可以创建自定义的授权器。自定义授权器需要实现 AuthorizationManager 接口,并重写 check 方