问题描述:
在Spring Security的配置过程中,当我们定义一个WebSecurityConfigurerAdapter时,当我们在configure方法中进行身份验证配置时,有时会遇到authenticationManager must be specified这个问题,这是因为我们没有注入一个AuthenticationManager。
解决方案:
为解决这个问题,我们可以在WebSecurityConfigurerAdapter配置类中注入一个AuthenticationManager以解决这个问题。具体使用方法如下:
1.在WebSecurityConfigurerAdapter配置类中注入一个AuthenticationManager
WebSecurityConfigurerAdapter类有一个authenticationManagerBean()方法,我们在这个方法中创建AuthenticationManager并且返回它,当我们需要访问AuthenticationManager时,就可以使用@Autowired自动装配AuthenticationManager。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService; //注入用户服务
@Override
protected void configure(HttpSecurity http) throws Exception {
//...
}
@Autowired
public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder.userDetailsService(userService);
}
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
我们只需用@Bean注解标注一下这个方法,或者重载WebSecurityConfigurerAdapter类的authenticationManagerBean()方法,它会返回AuthenticationManager的实现类。
示例:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService; //注入用户服务
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.permitAll();
}
@Autowired
public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder.userDetailsService(userService);
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
在上述示例中,我们注入了一个AuthenticationManager,这样就可以解决authenticationManager must be specified的错误了。
2.通过Java配置注入AuthenticationManager
我们可以通过另一种方式来解决authenticationManager must be specified的错误,即通过Java配置来实现注入AuthenticationManager。
示例:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService; //注入用户服务
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.permitAll();
}
@Bean
public AuthenticationManager authenticationManager() throws Exception {
return authenticationManagerBuilder().userDetailsService(userService).build();
}
}
在上述示例中,我们创建了一个AuthenticationManager Bean,这样就可以解决authenticationManager must be specified的错误了。
结论:
以上两种方法都可以解决authenticationManager must be specified的错误,具体使用哪种方法取决于你的业务需求。如果你同时需要使用AuthenticationManager和AuthenticationManagerBuilde,那么可以尝试使用第二种方法,否则可以使用第一种方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringSecurity报错authenticationManager must be spec的解决 - Python技术站