Spring安全性:如何使基于注释的角色规范优先于基于模式的角色规范

时间:2017-09-29 04:52:41

标签: spring spring-security

我希望结合基于角色的注释和基于模式的授权配置。

我希望基于模式的授权是“在没有指定注释的情况下的后备”。

带注释的方法端点的示例:

@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与“anonymousUrlPatterns”中的任何一个匹配 - 允许。
  • 如果端点与“publicApi”模式匹配并使用@PreAuthorize注释,请使用注释中的定义来确定用户是否可以访问它(在这种情况下,用户需要ADMIN或USER角色)。
  • 如果端点与“publicApi”模式匹配但未注释,则用户必须具有ADMIN角色才能访问它。
  • 如果端点与上述任何一个都不匹配 - 拒绝。

我将如何定义此行为?

使用上面指定的设置,基于模式的配置优先,端点调用被拒绝(我不确定基于模式的配置是否优先,或者Spring是否以某种方式组合它们?)

Spring版本 - 4.2.3

更新:我尝试将EnableGlobalMethodSecurity更新为:

@EnableGlobalMethodSecurity(
  prePostEnabled = true,
  order = Ordered.HIGHEST_PRECEDENCE)

但这似乎并没有改变这种行为。

1 个答案:

答案 0 :(得分:1)

根据@dur的评论,您似乎无法使用基本配置执行此操作。

在默认的Spring Security AccessDecisionManager策略下,基于模式的规则中的“否”投票将导致整个调用被拒绝。

看起来我想要的行为将涉及编写一些自定义决策管理器逻辑,例如:http://www.baeldung.com/spring-security-custom-voter