springsecurity:如何使基于注解的角色规范优先于基于模式的角色规范

os8fio9y  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(273)

我想结合基于角色的注解和基于模式的授权配置。
我希望基于模式的授权是“在没有指定注解的情况下的回退”。
带注解的方法终结点示例:

@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)

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

b1zrtrql

b1zrtrql1#

根据@dur的评论,用一个基本配置似乎做不到这一点。
在默认的springsecurityaccessdecisionmanager策略下,来自基于模式的规则的“no”投票将导致整个调用被拒绝。
我想要的行为似乎需要编写一些定制的决策管理器逻辑,比如:http://www.baeldung.com/spring-security-custom-voter

相关问题