spring预授权工作,但httpsecurity可能被忽略?

9fkzdhlc  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(243)

我在我的spring boot应用程序中使用openid和spring boot security进行了安全设置。
由于偶然的原因,我忘了将角色类型添加到我的 @PreAuthorize("hasAnyRole('...)") 标记并尝试打电话作为 USER 并被拒绝(403),但我确实在我的securityconfig文件中声明了hasanyrole。一旦我将角色添加到preauth标记中,它就工作了,但我想知道这是否是预期的行为?还是我在安全配置文件中做错了什么?
我正在使用以下spring boot安全设置

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth.boot</groupId>
            <artifactId>spring-security-oauth2-autoconfigure</artifactId>
            <version>2.2.13.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-openid</artifactId>
        </dependency>

网络安全文件

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    private JdbcOidcBearerTokenFilter filter;

    @Autowired
    public WebSecurityConfig(@Value("${security.oauth2.client.wellKnownUrl}") String wellKnown
            , @Value("${security.oauth2.client.clientId}") String clientId
            , @Value("${security.oauth2.client.clientSecret}") String clientSecret
            , EaUserService usersService, LoginService loginService) {

        OidcService oidcService = new OidcService(wellKnown, clientId, clientSecret);
        this.filter = new JdbcOidcBearerTokenFilter(oidcService, usersService, loginService, "Authorization");
    }

    @Override
    public void configure(WebSecurity webSecurity) {
        webSecurity
                .ignoring()
                .antMatchers("/error", "/403.html");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .addFilterAfter(new OAuth2ClientContextFilter(), AbstractPreAuthenticatedProcessingFilter.class)
                .addFilterAfter(this.filter, OAuth2ClientContextFilter.class)
                .authorizeRequests()
                .antMatchers("/api/login/**", "/static/**").permitAll()   
                .antMatchers("/api/enforcementactions/**").hasAnyRole("ADMIN","DEVELOPER","USER")
    }
}

控制器与预授权标签在这里我忘了添加'用户'的标签,在第一次被拒绝访问,但不应该在httpsecurity方法中的上述设置已经照顾它?

@PreAuthorize("hasAnyRole('ADMIN','DEVELOPER','USER')")
@RestController
@RequestMapping("/api/enforcementactions")
public class EnforcementActionsController {

    @Autowired
    private EnforcementActionsService service;

    @GetMapping("/getallactions")
    public ResponseEntity<?> getAllEnforcementActions() {
        ... do stuff here and return data
    }
xqnpmsa8

xqnpmsa81#

世界的规则 HttpSecurity 配置没有被忽略,只是在中的规则之前对其进行了评估 @PreAuthorize .
打电话给 /api/enforcementactions 来自角色为的用户 USER 将首先通过Spring安全过滤器链。
这就是规则的来源 HttpSecurity 将进行检查。
它指出,如果用户具有以下任何角色 "ADMIN" , "DEVELOPER""USER" 然后他们可以继续。
该用户具有该角色 "USER" 因此,请求将沿着过滤器链继续。
一旦请求通过了过滤器链,那么规则将在 @PreAuthorize 将在调用控制器方法之前进行检查。
此规则声明只有具有角色的用户 "ADMIN""DEVELOPER" 可以访问此方法,并且我们的用户只有角色 "USER" 所以他们的请求在这一点上被拒绝了。
看来 @PreAuthorize 规则是唯一被考虑的,但这是因为它更具体。
如果规则生效 HttpSecurity 更具体的是,请求将在到达之前在过滤器链中被拒绝 @PreAuthorize .

相关问题