如何将全局方法安全性与Web安全配置适配器一起使用作为备用?

时间:2019-04-16 11:44:12

标签: java spring-boot spring-security

我正在尝试使用Web安全配置程序适配器作为为服务的所有终结点定义默认访问策略的方式,然后将@PreAuthorize作为定义Web服务终结点的访问规则的精细机制。 / p>

但是同时使用这两种方法时,@ PreAuthorize无效。

我正在开发一个基于微服务体系结构的平台,为了找出如何将不同的OAuth2 / OIDC部分组合在一起,我正在编写几个示例微服务,这些示例将实现“资源服务器”角色,并且“客户端”角色。

所有这些都具有最新,最出色的Spring Boot(2.1.4-RELEASE),Spring Security和Spring OAuth2资源服务器以及Jose(用于JWT)。

我已经定义了一个具有两种方法的控制器,其中一种是“ public”,我正尝试使用@PreAuthorize打开,另一种是“ private”,没有注释。

@RestController
public class DefaultController {

    private String getCurrentTime() {
        return (new Date(System.currentTimeMillis()).toString());
    }

    @GetMapping("/publicTime")
    @PreAuthorize("permitAll()")
    public ResponseEntity<?> getPublicTime() {
        return new ResponseEntity<>("PUBLIC - " + getCurrentTime(), HttpStatus.OK);
    }

    @GetMapping("/privateTime")
    public ResponseEntity<?> getPrivateTime() {
        return new ResponseEntity<>("PRIVATE - " + getCurrentTime(), HttpStatus.OK);
    }
}

然后我写了这个Web安全配置适配器

@Configuration
@Profile("devevelopmentwithauth")
@Slf4j
@EnableWebSecurity
public class DevWithAuthSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .oauth2ResourceServer().jwt();
    }
}

这要求对所有请求进行身份验证,并将OAuth2资源服务器配置为使用JWT。

运行代码时它的配置文件处于活动状态,因此正在加载此配置类。

这是启用@ Pre / @ PostAuthorize批注的其他配置类的代码

@Configuration
@Profile("devevelopmentwithauth")
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Slf4j
public class MethodSecurityConfigurer {

}

运行此服务时,我期望对“ / publicTime”的访问将返回HTTP 200,由其@PreAuthorize批注拾取并允许所有访问,而“ / privateTime”将返回HTTP 401,因为它没有@ PreAuthorize批注,据我所知,应该退回到Web安全配置器适配器中的配置。

我尝试更改两个过滤器的顺序,因为我注意到,当Web安全配置适配器具有“ permitAll()”时,@ PreAuthorize批注会生效,但这没什么区别。

对我可能会丢失的东西有什么想法吗?

0 个答案:

没有答案