我想结合基于角色的注解和基于模式的授权配置。
我希望基于模式的授权是“在没有指定注解的情况下的回退”。
带注解的方法终结点示例:
@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();
;
}
}
下面是我想要的工作方式:
如果端点url匹配任何“匿名url模式”-请允许。
如果端点与“publicapi”模式匹配,并用 @PreAuthorize
,使用注解中的定义来决定用户是否可以访问它(在这种情况下,用户需要管理员或用户角色)。
如果端点与“publicapi”模式匹配,但没有注解,则用户必须具有admin角色才能访问它。
如果端点不匹配上述任何一项-deny。
我该如何定义这种行为?
在上面指定的设置中,基于模式的配置优先,端点调用被拒绝(我不确定基于模式的配置是否优先,或者spring是否以某种方式组合它们?)
Spring版本-4.2.3
更新:我已尝试将enableglobalmethodsecurity更新为:
@EnableGlobalMethodSecurity(
prePostEnabled = true,
order = Ordered.HIGHEST_PRECEDENCE)
但这似乎并没有改变这种行为。
1条答案
按热度按时间b1zrtrql1#
根据@dur的评论,用一个基本配置似乎做不到这一点。
在默认的springsecurityaccessdecisionmanager策略下,来自基于模式的规则的“no”投票将导致整个调用被拒绝。
我想要的行为似乎需要编写一些定制的决策管理器逻辑,比如:http://www.baeldung.com/spring-security-custom-voter