【发布时间】:2020-07-22 21:13:33
【问题描述】:
尊敬的社区:我写这篇文章是为了询问我必须如何配置 AuthenticationManagerBuilder。
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService secUserDetailsService;
@Autowired
private PasswordEncoder secPasswordEncoder;
. . .
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider());
}
@Autowired
public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(secUserDetailsService).passwordEncoder(secPasswordEncoder);
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(secUserDetailsService);
authenticationProvider.setPasswordEncoder(secPasswordEncoder);
return authenticationProvider;
}
}
我应该遵循哪个实现
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider());
}
和
@Autowired
public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(secUserDetailsService).passwordEncoder(secPasswordEncoder);
}
另外,我发现如果我评论整个 '@Override protected void configure(AuthenticationManagerBuilder auth) 方法,我的应用程序运行良好,但是当我评论 @Autowired public void globalUserDetails(AuthenticationManagerBuilder auth ),出现以下错误:
o.s.s.o.p.endpoint.TokenEndpoint.handleException:169 - Handling error: IllegalStateException, UserDetailsService is required.
java.lang.IllegalStateException: UserDetailsService is required.
at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:464)
at org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper.loadUserDetails(UserDetailsByNameServiceWrapper.java:68)
at org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider.authenticate(PreAuthenticatedAuthenticationProvider.java:103)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:175)
...
我应该使用哪种方法?此外,(这是我最关心的问题)如果我同时使用这两种方法,是否存在任何性能问题?
【问题讨论】:
-
如果同时注释掉
AuthenticationManagerbean 和globalUserDetails方法,只留下configure(AuthenticationManagerBuilder)方法,是否有效? -
@pero_hero 然后应用程序无法启动:AuthorizationServerConfiguration 中的字段 authenticationManager 需要一个找不到的 'org.springframework.security.authentication.AuthenticationManager' 类型的 bean。调用 refreshToken API 时出现上述错误(os.s.o.p.endpoint.TokenEndpoint)。
-
如果将
configure方法更改为与globalUserDetails方法相同,会发生什么情况:auth.userDetailsService(secUserDetailsService).passwordEncoder(secPasswordEncoder)? -
@pero_hero 发生了同样的错误。 (
UserDetailsService是必需的)。顺便说一句,我找到了一些有用的链接:github.com/spring-projects/spring-security/issues/4571。但仍然不确定同时使用它们不会导致任何性能问题。到目前为止似乎还可以:p
标签: spring-boot spring-security