我有一个带有Spring MVC的Spring Boot应用程序和带有管理端点的Spring Boot Actuator。我使用自定义WebSecurityConfigurerAdapter
来使用基于表单的登录,要求对所有请求(登录除外)进行身份验证,并使用自定义UserDetailsService将用户从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 {
}
}
日志警告来自我的application.properties中的management.security.enabled=false
。我之所以这样做是因为我无法访问我想要开发的端点。
由于某些未知原因,我无法在示例应用程序中使用相同的配置。在我的原始应用程序中,我使用代码:
@Autowired public void configureGlobal(AuthenticationManagerBuilder auth)抛出异常{ auth.userDetailsService(userLookupService) .passwordEncoder(的PasswordEncoder); }
但是在这个应用程序中,这会导致以下异常:
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项目,并且可能在配置模块的顺序方面存在一些差异。