SpringSecurity:全局AuthenticationManager与局部AuthenticationManager

Posted 刚刚好。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringSecurity:全局AuthenticationManager与局部AuthenticationManager相关的知识,希望对你有一定的参考价值。

在之前的分析中我们已经知道了Spring Security是由AuthenticationManager(ProviderManager)把认证请求分发给多个认证器。

在Spring Security中存在全局AuthenticationManager与局部AuthenticationManager两种

我们先来看下面代码:

public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception{

//简单定义一个基于内存的UserDetailsService实例 作为示范
InMemoryUserDetailsManager users=new InMemoryUserDetailsManager();
users.createUser(User.withUsername("javaboy").password("{noop}123456").roles("admin").build());

http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.permitAll()
.and()
.userDetailsService(users)
.csrf().disable();
}
}

此时我们虽然配置了UserDetailsService,但是我们发现使用 Spring Security生成的用户 仍能登录!

原因很简单,因为此时我们注册的是一个局部AuthenticationManager,系统仍会生成一个全局AuthenticationManager(AuthenticationConfiguration的getAuthenticationManager方法),全局AuthenticationManager会从Spring容器中寻找UserDetailsService实例,由于我们也没有往容器中注入UserDetailsService实例,因此会使用系统提供的实例!

虽然在实际使用中对我们没有太大的影响,因为Spring Security会先使用局部AuthenticationManager进行认证,再使用全局AuthenticationManager进行认证。但如果我们想要直接修改全局AuthenticationManager的话,有两种思路:
(一)直接生成全局AuthenticationManager
(二)往Spring容器中注入UserDetailsService实例

先说第一种,生成全局AuthenticationManager只需要重写configure(AuthenticationManagerBuilder auth)方法

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
UserDateService userDateService;

//注意是参数为AuthenticationManagerBuilder的configure方法
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.userDetailsService(userDateService);

}
....

}

往Spring容器中注入UserDetailsService实例更简单,只需要加一个@Bean注解即可!

需要注意的是,一旦我们重写了configure(AuthenticationManagerBuilder auth)方法,则使用的UserDetailsService实例 则是 方法中注入的实例,此时容器中的UserDetailsService实例将不起作用!(AuthenticationConfiguration的getAuthenticationManager方法没有被调用!)

以上是关于SpringSecurity:全局AuthenticationManager与局部AuthenticationManager的主要内容,如果未能解决你的问题,请参考以下文章

SpringSecurity:全局AuthenticationManager与局部AuthenticationManager

Grails 3 和 Spring Security - 在过滤器中验证用户

Spring Security应用开发(12) 获取已登录用户信息

Spring Security 3.2 - 配置全局方法安全性以使用角色层次结构

记录 Spring Security OAuth2 身份验证失败的推荐方法是啥?

Spring Security:为 HttpSecurity 全局配置时忽略 hasAuthority