Я пытался добавить пользовательский фильтр с дополнительным параметром входа в Spring Security, после чего должны быть указаны https://www.baeldung.com/spring-security-extra-login-fields и Менеджер аутентификации Spring Security - для пользовательского фильтра , используя addFilterBefore в мой метод configure () Проблема в том, что я получаю следующее сообщение об ошибке:
org.springframework.beans.factory.BeanCurrentlyInCreationException: Ошибка при создании компонента с именем 'customLoginFilter': в данный момент создается запрашиваемый компонент: существует неразрешимая круговая ссылка?
Вот WebSecurityConfig:
@Resource(name = "userDetailsService")
private UserDetailsService userDetailsService;
@Autowired
@Qualifier("authenticationProvider")
AuthenticationProvider authenticationProvider;
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public CustomLoginFilter customLoginFilter() throws Exception {
CustomLoginFilter customLoginFilter = new CustomLoginFilter();
customLoginFilter.setAuthenticationManager(authenticationManagerBean());
return customLoginFilter;
}
@Autowired
CustomLoginFilter customLoginFilter;
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
auth.inMemoryAuthentication()
.withUser("spring")
.password("{bcrypt}"+encoder.encode("secret"))
.roles("USER");
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.addFilterBefore(customLoginFilter, UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.antMatchers("/v2/api-docs", "/swagger-resources/configuration/ui", "/swagger-resources", "/swagger-resources/configuration/security", "/swagger-ui.html", "/webjars/**").permitAll()
.antMatchers("/login").permitAll()
//...
.anyRequest().authenticated()
.and().csrf().disable();
}
Пользовательский фильтр:
public class CustomLoginFilter extends UsernamePasswordAuthenticationFilter {
@Override
public Authentication attemptAuthentication(
HttpServletRequest request,
HttpServletResponse response)
throws AuthenticationException {
UsernamePasswordAuthenticationToken authRequest = getAuthRequest(request);
setDetails(request, authRequest);
return this.getAuthenticationManager()
.authenticate(authRequest);
}
private UsernamePasswordAuthenticationToken getAuthRequest(
HttpServletRequest request) {
String username = obtainUsername(request);
String password = obtainPassword(request);
String nmDossier = obtainDossier(request);
String usernameDomain = String.format("%s%s%s", username.trim(),
String.valueOf(Character.LINE_SEPARATOR), nmDossier);
return new UsernamePasswordAuthenticationToken(
usernameDomain, password);
}
private String obtainDossier(HttpServletRequest request){
return request.getParameter("dossier_number");
}
@Override
@Autowired
public void setAuthenticationManager(AuthenticationManager authenticationManager) {
super.setAuthenticationManager(authenticationManager);
}
}