以相同的方法为 tls 和 Oauth2 配置 http 安全

http security config for tls and Oauth2 in the same method

我想制作一个配置文件来在我的 SecureConfig.java

中配置 TLS 和 Oauth2

tls 配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().authenticated().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.NEVER);
}

Oauth2.0配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .requiresChannel()
            .anyRequest()
            .requiresSecure();
}

在同一个配置文件和方法中使用这两者的更好方法是什么? and() 是否正常工作?

像那样:

    @Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER).and()
            .requiresChannel()
            .anyRequest()
            .requiresSecure();
}

你的两个过滤器链方法有问题(不管你在方法中配置什么

  • Spring 安全性是一个过滤器链,请参阅
  • 通过执行 configure(HttpSecurity http) 两次,您已经创建了 two spring-security-filter-chains。
  • 由于您没有提供 http.requestMatcher(...),因此这两个链都适用于每个 url。这对 spring 安全性来说是一个问题,因为它只会将一个过滤器链应用于特定请求。因此,如果您尝试启动您的应用程序,它将无法启动并出现错误
  • 您可以通过定义 @Order 注释来启动您的应用程序,这样 spring 安全性会选择适用于 url 的较小编号的注释。但是由于根据您的配置,这两个链都适用于每个 url,因此具有较低 @Order 的过滤器链会覆盖具有较高 @Order 的过滤器链,使其无用

解决方案

  • 使用一个 class 扩展 WebSecurityConfigurerAdapter 这样你就有了一个安全过滤器链

通道安全与身份验证与授权

  • 安全主要是4个方面。身份验证、授权、完整性和机密性。

  • 过滤器中的内容与身份验证有关。您可能还定义了一些 urls 需要一些授权角色。所以那个配置是​​关于这两个方面的

  • requiresSecure() 您正在寻址 Confidentiality。即,如果您在没有第一个的情况下使用 requiresSecure(),您知道您不是在与某个中间人交谈,但您不会知道您在与谁交谈,因为这就是身份验证的目的。

  • 由于它们是互补的安全方面,它们可以组合在一起,spring 将创建一个过滤器链,其中第一个过滤器确保您首先通过放置 ChannelProcessingFilter作为第一关