我有 SPNEGO 的 Spring 安全配置,它正在“通过黑客”工作。它看起来如下:
@Configuration
@EnableWebSecurity
public class SpnegoConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.addFilterBefore(
spnegoAuthenticationProcessingFilter(authenticationManagerBean()),
BasicAuthenticationFilter.class); // 1
}
@Override
@Autowired // 3
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth
.authenticationProvider(kerberosAuthenticationProvider())
.authenticationProvider(kerberosServiceAuthenticationProvider());
}
@Bean
public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter(
AuthenticationManager authenticationManager) { // 2
SpnegoAuthenticationProcessingFilter filter =
new SpnegoAuthenticationProcessingFilter();
filter.setAuthenticationManager(authenticationManager);
return filter;
}
...
}
怎么了:
- 我需要添加 spnegoAuthenticationProcessingFilter (1)
- 该过滤器依赖于authenticationManager (2)
- 我需要添加身份验证提供程序 (3)
重点是在这个类中WebSecurityConfigurerAdapter
我重写了两种方法:
-
configure(HttpSecurity http)
- 这依赖于已经构建的AuthenticationManager
通过自定义过滤器
-
configure(AuthenticationManagerBuilder auth)
- 这显然与AuthenticationManager
尚未建造 - 我们正在建造它
如果我没有@Autowired
就方法(3)而言AuthenticationManager
建得太早了,我添加了AuthenticationProvider
s 没有影响。身份验证失败,异常没有合适的AuthenticationProvider
.
随着@Autowired
在适当的地方它可以工作,但如果感觉不对。我什至不知道为什么它然后开始工作。
请建议正确的方法。
Edit:它实际上可以在没有@Autowired 的情况下工作。但重点在于已接受的答案。如果你曾经依赖过AuthenticationManager
in @Configuration
确保它通过以下方式公开或引用authenticationManagerBean()
method.
你用错了AuthenticationManager
.
如果您想使用AuthenticationManager
from SpnegoConfig
使用依赖注入,你必须公开它,请参阅JavaDoc http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.html#authenticationManagerBean--:
重写此方法以将 AuthenticationManager 从 configure(AuthenticationManagerBuilder) 公开为 Bean。例如:
@Bean(name name="myAuthenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
如果你想配置全局AuthenticationManager
,你必须自动连接AuthenticationMangerBuilder
, see Spring Security 3.2.0.RC2 发布 https://spring.io/blog/2013/11/01/spring-security-3-2-0-rc2-released#objectpostprocessor-quiesent-postprocessor-removed
例如,如果您想配置全局身份验证(即您只有一个 AuthenticationManager),您应该自动装配 AuthenticationMangerBuilder:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
// ... configure it ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)