spring-security 是否可以在Sping Boot 中交替使用hasAnyRole()和@RolesAllowed?[duplicate]

zed5wv10  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(163)

此问题在此处已有答案

Multiple antMatchers in Spring security(1个答案)
How to fix role in Spring Security?(2个答案)
上个月关门了。
我在同一个Controller类下有两个方法-一个用于公共端点,另一个用于授权用户。

public class Controller {

    @GetMapping("/endpoint")
    public ResponseEntity public() {...}

    @GetMapping("/internal/endpoint")
    public ResponseEntity internal() {...}

}

在“安全配置”中,我有:

http
   .csrf().disable()
   .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
   .and()
   .authorizeRequests()
   .antMatchers("/**").permitAll()
   .antMatchers("/internal/**").authenticated()

如果我将@RolesAllowed({"ROLE_A", "ROLE_B"})添加到internal()方法中,我会得到一个403,表示不允许的角色。但是如果我删除它并将.antMatchers("/internal/**").hasAnyRole("ROLE_A", "ROLE_B")添加到安全配置中,它将允许具有未授权角色的用户访问内部端点。
我的问题是-我可以互换使用它们吗?如果可以,我遗漏了什么?因为我有相当多的内部端点,所以我更喜欢在安全配置中进行角色检查,而不是向每个内部方法添加@RolesAllowed,但我也愿意遵循最佳实践。

plicqrtu

plicqrtu1#

因为我使用的是.hasAnyRole("ROLE_A", "ROLE_B")而不是.hasAnyAuthority("ROLE_A", "ROLE_B"),所以它不能工作。我必须使用.hasAnyRole("A", "B")来使它工作。ROLE_前缀会自动添加到值中。所以我的工作配置是

http
    .csrf().disable()
    .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
    .authorizeRequests()
        .antMatchers("/internal/**").hasAnyRole("A", "B")
        .antMatchers("/**").permitAll()

相关问题