具有基本身份验证和 OAuth 顺序问题的 Spring Boot 安全性

Posted

技术标签:

【中文标题】具有基本身份验证和 OAuth 顺序问题的 Spring Boot 安全性【英文标题】:Spring Boot Security with Basic Auth and OAuth Order Issue 【发布时间】:2018-09-01 21:05:17 【问题描述】:

我正在尝试实现一个简单的 Spring Boot 项目。我有几个 REST 端点,我必须以不同的方式保护它们。一个必须由 Basic Auth 保护,另一个需要 OAuth 保护,另一个需要自定义安全实现。

REST 端点:

/basic/auth /application/secure (oauth) /application/secure2(自己的实现)

从教程中,我知道我必须设置安全适配器的顺序。我的第一个意图是以十为步长设置顺序(例如@Order(10)@Order(20)),以防我需要在其间添加其他安全过滤器。通过这样做,我调查了以下行为:

如果我添加带有@Order(10) 的基本身份验证过滤器和带有@Order(20) 的OAuth 过滤器,则只有OAuth 过滤器有效。 如果我添加带有 @Order(1)@Order(2) 的基本身份验证过滤器和带有 @Order(4) 的 OAuth 过滤器,这两个过滤器都可以工作。 如果我向@Order(3) 添加过滤器,我会收到一条错误消息,指出订单 3 已在使用中,无法配置两次。

所以有一个默认的 spring 安全适配器(或其他),它的默认顺序是 3。我想我通过添加 @EnableWebSecurity 来禁用每个默认的 spring 安全行为。在我没有找到谷歌的答案后,我的问题是:

我在做正确的事吗? 什么是春季订购 3 的安全适配器? 默认安全适配器会阻止我的基本身份验证实现吗?

WebSecurityConfig:

   @Configuration
   @EnableWebSecurity
   public class WebSecurityConfig 

    @Order(10)
    @Configuration
    public class BasicAuthConfig extends WebSecurityConfigurerAdapter 
        @Value("$security.user.password")
        private String password;
        @Value("$security.user.name")
        private String username;

        private static final String ROLE_ADMIN = "ADMIN";

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception 
            auth.inMemoryAuthentication().withUser(username).password(password).roles(ROLE_ADMIN);
        

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http.csrf().disable();
            http.requestMatchers().antMatchers("/basic/**", "/") //
                    .and().authorizeRequests().anyRequest().authenticated() //
                    .and().httpBasic();
        
    

    @Order(20)
    @Configuration
    @EnableResourceServer
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    protected static class Oauth2ServerConfig extends ResourceServerConfigurerAdapter 
        @Override
        public void configure(HttpSecurity http) throws Exception 
            System.out.println("Filter called");
            // @formatter:off
            http.csrf().disable();
            http.authorizeRequests().antMatchers("/application/**").authenticated()
                    // .antMatchers(GET, "/application/secure").authenticated()
                    .anyRequest().authenticated(); 
            // @formatter:on
        

     // offline token validator

    

【问题讨论】:

见***.com/a/49429040/5277820 mh,我仍然不明白为什么如果 order 设置为比 3 更大的值,则不会调用新的 WebSecurityConfigurerAdapter。不应该在之后调用或匹配何时调用请求路径?由@EnableResourceServer 创建的WebSecurityConfigurerAdapter 是否会覆盖所有其他WebSecurityConfigurerAdapter?这意味着我在使用 @EnableResourceServer 时仅限于两个过滤器。 重要的是要理解,只应用一种配置。链中的第一个匹配请求。其他所有内容均未应用。 不,对于BasicAuthConfig,它是/basic/**/,对于Oauth2ServerConfig,它是/** 见***.com/questions/33603156/…和***.com/a/41527591/5277820。 【参考方案1】:

这是一个老问题,但如果有人仍然想知道问题是什么,以下是我的观察:

@EnableResourceServer 导入 ResourceServerConfiguration,其顺序为 3。 有一些方法可以让您在 order 3 资源服务器配置器之前添加超过 2 个过滤器,例如 通过给其中一些负序值(虽然我不认为负值有什么特别之处,但需要考虑其他隐含的web security configurers - 例如订单为 0 的那个 - 启用默认值。然而,这意味着随着新功能的引入,不同版本框架中的过滤器之间可能会发生冲突); 通过将它们添加为资源配置器(ResourceServerConfiguration 类不会添加任何请求匹配器,但如果用户未配置任何内容,则会强制回退到 anyRequest().authenticated()。 为了更好地了解路径在配置的请求匹配器中的匹配方式,您可以快速浏览Ant path patterns。

【讨论】:

以上是关于具有基本身份验证和 OAuth 顺序问题的 Spring Boot 安全性的主要内容,如果未能解决你的问题,请参考以下文章

具有基本身份验证和自定义 UserDetailsS​​ervice 的 Spring Boot OAuth2

OAuth2 密码授予和基本身份验证

具有基本身份验证的 Exchange Online 和 EWS 停止工作

OAuth 和基本身份验证一起使用

具有同源策略和 OAuth 的 REST API 身份验证

HTTP 基本身份验证和 OAuth 2.0 相同吗?