@Order注解在Spring Security中是如何工作的?
时间: 2024-09-23 14:13:03 浏览: 15
`@Order` 注解在 Spring Security 中用于控制访问权限策略的顺序。当你在一个过滤器、授权注解或自定义的安全配置中使用它时,你可以为一个特定的权限检查指定优先级。Spring Security 的 `AccessDecisionManager` 接收一组排序的`AccessDecisionVoter` 实例,并按照它们的顺序执行投票决策。
例如,在 Web 安全配置中,你可以这样使用 `@Order`:
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private SomePermissionService permissionService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasPermission("USER_PERMISSION")
.anyRequest().permitAll() // 如果所有其他条件都不满足,则允许访问
.and()
.authorizeRequests()
// 使用 @Order(0) 表示更高的优先级,先于默认的 Order(通常为1)
.requestMatchers(hasPermission("ADMIN_PERMISSION")).order(0)
.accessDecisionManager(new MyAccessDecisionManager())
// ...
}
@Component
public class MyAccessDecisionManager implements AccessDecisionManager {
@Autowired
private PermissionEvaluator permissionEvaluator;
@Override
public AuthorizationDecision getAuthorizationDecision(AuthorizationRequest request) throws InsufficientAuthenticationException, InsufficientAuthorizationException {
return new SimpleAuthorizationDecision(permissionEvaluator.isGranted(request.getPrincipal(), "ADMIN_PERMISSION"));
}
}
}
```
在这个例子中,`@Order(0)` 的 `hasPermission("ADMIN_PERMISSION")` 检查会在其他规则之前执行,因为它的优先级更高。如果你有多组这样的注解,`AccessDecisionManager` 将按注解值的大小进行比较,数值越小优先级越高。