我正在配置Spring Security。要对用户进行身份验证和授权,请覆盖configure(AuthenticationManagerBuilder auth)
的{{1}}。这很好用。以下是我的代码:
WebSecurityConfigurerAdapter
但是当我尝试启用方法级别的安全性时,每个操作使用@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(customUserDetailsService)
.passwordEncoder(getPasswordEncoder());
}
会引发异常:
未找到AuthenticationManager
根据我的理解@EnableGlobalMethodSecurity(securedEnabled = true)
用于对用户进行身份验证和授权,我已经使用AuthenticationManager
进行了操作,而Spring正在注入configure(AuthenticationManagerBuilder auth)
对象本身。
为什么我需要手动注册auth
?
AuthenticationManager
@Bean @Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
和configure(AuthenticationManagerBuilder auth)
有哪些不同用途?
我正在延长authenticationManagerBean()
。为什么我需要通过覆盖WebSecurityConfigurerAdapter
来提供自定义AuthenticationManager
。
答案 0 :(得分:4)
您的配置类扩展WebSecurityConfigurerAdapter
,它只配置Web安全性(不是方法安全性):
为创建
WebSecurityConfigurer
实例提供方便的基类。该实现允许通过重写方法进行自定义。
因此,您的AuthenticationManager
仅用于网络安全。
如果要配置(更改默认值)方法安全性,可以扩展GlobalMethodSecurityConfiguration
:
用于启用全局方法安全性的基础
Configuration
。类可以扩展此类以自定义默认值,但必须确保在子类上指定EnableGlobalMethodSecurity
注释。
要为方法安全配置AuthenticationManager
,您可以
覆盖GlobalMethodSecurityConfiguration#configure
:
子类可以覆盖此方法以注册不同类型的身份验证。如果未被覆盖,
configure(AuthenticationManagerBuilder)
将尝试按类型自动装配。
将您的AuthenticationManager
公开为可由GlobalMethodSecurityConfiguration
自动装配的bean,请参阅WebSecurityConfigurerAdapter#authenticationManagerBean
:
重写此方法以将
AuthenticationManager
从configure(AuthenticationManagerBuilder)
公开,以显示为Bean。
通过自动装配全局AuthenticationManager
,只使用一个全局AuthenticationManagerBuild
,请参阅Spring Security 3.2.0.RC2 Released:
例如,如果要配置全局身份验证(即只有一个AuthenticationManager),则应自动连接AuthenticationMangerBuilder:
@Autowired public void configureGlobal(AuthenticationManagerBuilder auth) { // ... configure it ... }