【问题标题】:Spring OAuth2 Authorization Server with Actuator endpoints secured with basic authSpring OAuth2 授权服务器,带有基本身份验证保护的执行器端点
【发布时间】:2020-07-13 10:30:04
【问题描述】:

我有 Spring Spring OAuth2 授权服务器。这是我的微服务之一(称为用户管理)。它在数据库中保存用户和密码,还保存一些其他“安全相关”实体。这意味着我有 UserDetailsS​​ervice 的自定义实现,它包装了 Spring Security 操作的用户加载。 这个微服务是授权服务器,但它也是资源服务器,因为存在一些与用户、组织、组织成员等相关的持久性和域逻辑......我的大多数 REST 端点都使用标头中的 OAuth2 令牌访问,一切正常。

但我也在使用通常由 Spring Boot Admin 服务器访问的 Spring Actuator。对于这些端点,我使用的是 Http 基本身份验证,因此我有一些用于 /actuator/** 端点的自定义 WebSecurityConfigurerAdapter。在所有微服务中,我都有在 application.yaml 配置中定义的这些执行器端点访问的用户,它工作正常。但是...如果使用自定义 UserDetailsS​​ervice 实现的这种用户管理将不起作用。

问题是,在执行执行器端点调用的基本身份验证时,DaoAuthenticationProvider 对我的自定义 UserDetailsS​​ervice 有引用,它试图在我的数据库中查找用户,但它不存在。当所有其他微服务发生这种情况时,就会有 UserDetailsS​​ervice 的 InMemoryUserDetailsManager 实现(由 DaoAuthenticationProvider 使用),其中包含来自 application.yaml 的用户。

知道如何解决或解决问题吗?

  • 创建执行器端点访问数据库的用户?我不喜欢它,因为它与我的其他微服务不同
  • 创建一个委托 UserDetailsS​​ervice 来检查两个用户存储?我不知道如何配置它,因为 InMemoryUserDetailsManager 看起来不像托管 bean,所以有一些手动编程。
  • 或者有什么不同的正确方法吗?如何配置?

非常感谢, 卢卡斯

【问题讨论】:

    标签: spring-security basic-authentication spring-security-oauth2


    【解决方案1】:

    经过一些调查,我找到了看起来不错的解决方案。我为执行器端点创建了专用配置,可以在其中设置 UserDetailsS​​ervice 的专用实现。我选择了 InMemoryUserDetailsManager,它在您不使用自定义实现时用作默认值。

    这意味着 WebSecurityConfigurerAdapter 的其他实例和 AuthorizationServerConfigurerAdapter 的实现不会干扰这些执行器端点的安全性

    @Configuration
    @Order(1)
    public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    
        @Autowired
        private InMemoryUserDetailsManager inMemoryUserDetailsManager;
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.userDetailsService(inMemoryUserDetailsManager)
                    .antMatcher("/actuator/**").httpBasic().and()
                    .csrf().disable()
                    .headers().disable();
        }
    }
    

    我必须手动创建 InMemoryUserDetailsManager 实例并从配置中注入值。

        @Value("${spring.security.user.name}")
        private String systemUserName;
    
        @Value("${spring.security.user.password}")
        private String systemUserPassword;
    
        @Bean
        public InMemoryUserDetailsManager inMemoryUserDetailsManager()
        {
            List<UserDetails> userDetailsList = new ArrayList<>();
            userDetailsList.add(User.withUsername(systemUserName).password(systemUserPassword).authorities("USER").build());
    
            return new InMemoryUserDetailsManager(userDetailsList);
        }
    

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 2018-01-14
      • 1970-01-01
      • 2018-09-26
      • 2017-07-30
      • 2016-04-10
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多