Spring Boot WebSecurityConfigurerAdapter

时间:2015-02-11 09:29:03

标签: spring-security spring-boot

背景

我有一个带有Spring MVC的Spring Boot应用程序和带有管理端点的Spring Boot Actuator。我使用自定义WebSecurityConfigurerAdapter来使用基于表单的登录,要求对所有请求(登录除外)进行身份验证,并使用自定义UserDetailsS​​ervice将用户从MongoDB数据源中拉出来。

问题

一旦我使用自定义WebSecurityConfigurerAdapter,我就无法再访问任何健康端点管理。我也在日志中看到了这一点:

    WARN .EndpointWebMvcChildContextConfiguration : 
No single bean of type ManagementWebSecurityConfigurerAdapter 
found (this might make some endpoints inaccessible without authentication)

我对这条消息感到有些困惑,因为我还没有配置自己的ManagementAdapter。即使我进行身份验证,我仍然无法访问端点,例如/health/beans(但我可以访问其他自定义应用程序端点。

我想要实现的目标

理想情况下,我想单独配置执行器和我的应用程序。

我希望只使用标准ManagementSecurityAutoConfiguration配置内存身份验证领域,仅使用基本身份验证管理端点,并继续使用基于表单的登录,并为所有人提供自定义用户详细信息服务应用程序端点。

无论如何我能做到这一点吗?如果它是相关的,我在不同的端口(management.port=8081)上运行执行器,所以如果有办法以不同的方式配置两个端口,那么这可能会有效。

配置

@Configuration
public class SecurityConfiguration {

  @EnableWebSecurity
  @EnableWebMvcSecurity
  public static class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    UserLookupService userLookupService;

    @Autowired
    PasswordEncoder passwordEncoder;

    @Autowired
    AuthenticationSuccessHandler authenticationEventSuccessHandler;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth.userDetailsService(userLookupService)
        .passwordEncoder(passwordEncoder);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
        .anyRequest().authenticated().and()
        .csrf().disable();

      http.formLogin()
        .passwordParameter("password")
        .usernameParameter("username")
        .loginProcessingUrl("/user/login").permitAll()
        .successHandler(authenticationEventSuccessHandler);

      http.logout().logoutUrl("/user/logout").permitAll();
    }
  }

  @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
  public static class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
  }
}

编辑

  1. 日志警告来自我的application.properties中的management.security.enabled=false。我之所以这样做是因为我无法访问我想要开发的端点。

  2. 由于某些未知原因,我无法在示例应用程序中使用相同的配置。在我的原始应用程序中,我使用代码:

    @Autowired     public void configureGlobal(AuthenticationManagerBuilder auth)抛出异常{       auth.userDetailsS​​ervice(userLookupService)         .passwordEncoder(的PasswordEncoder);     }

  3. 但是在这个应用程序中,这会导致以下异常:

    Injection of autowired dependencies failed; nested exception is java.lang.IllegalStateException: Cannot apply org.springframework.security.config.annotation.authentication.configurers.userdetails.DaoAuthenticationConfigurer@3c443976 to already built object
    

    所以要解决此问题,我必须改写protected void configure(final AuthenticationManagerBuilder auth)方法。我不知道为什么会这样,我能想到的唯一真正的区别是我的原始应用程序是一个多模块Maven项目,并且可能在配置模块的顺序方面存在一些差异。

0 个答案:

没有答案