我希望结合基于角色的注释和基于模式的授权配置。
我希望基于模式的授权是“在没有指定注释的情况下的后备”。
带注释的方法端点的示例:
@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_USER')")
@RequestMapping(
method = RequestMethod.POST,
headers = "Accept=application/json",
path="publicApi/doWork" )
public void doWork() {
...
}
我的基于模式的授权配置如下所示:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
// specifies actuator endpoints should be secured by this config
@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private void configureEndpointRoles(HttpSecurity http) throws Exception {
http.authorizeRequests().
antMatchers(anonymousUrlPatterns()).permitAll().
antMatchers("/publicApi/**").access("hasAnyRole('ROLE_ADMIN')").
anyRequest().denyAll();
;
}
}
以下是我希望如何工作:
@PreAuthorize
注释,请使用注释中的定义来确定用户是否可以访问它(在这种情况下,用户需要ADMIN或USER角色)。 我将如何定义此行为?
使用上面指定的设置,基于模式的配置优先,端点调用被拒绝(我不确定基于模式的配置是否优先,或者Spring是否以某种方式组合它们?)
Spring版本 - 4.2.3
更新:我尝试将EnableGlobalMethodSecurity更新为:
@EnableGlobalMethodSecurity(
prePostEnabled = true,
order = Ordered.HIGHEST_PRECEDENCE)
但这似乎并没有改变这种行为。
答案 0 :(得分:1)
根据@dur的评论,您似乎无法使用基本配置执行此操作。
在默认的Spring Security AccessDecisionManager策略下,基于模式的规则中的“否”投票将导致整个调用被拒绝。
看起来我想要的行为将涉及编写一些自定义决策管理器逻辑,例如:http://www.baeldung.com/spring-security-custom-voter