У меня проблема с включением AbstractAuthenticationProcessingFilter для нескольких точек входа в аутентификации.
Мне нужно войти двумя способами: одним с идентификатором электронной почты, а другим - с идентификатором сотрудника из пользовательского интерфейса, обоими способами мне нужно получитьJWT токен для того же я настроил
Идентификатор сотрудника с LDAP Конфигурация с URL-адресом входа / логин
Идентификатор электронной почты с Пользовательская аутентификация с URL-адресом для входа / loginWD
Я настроил 2 WebSecurityConfigurerAdapter
App1ConfigurationAdapter для LDAP с заказом 1 и App2ConfigurationAdapter для CustomAuthentication с заказом 2
Когда мыhit / loginWD JWTAuthenticationFilter, который расширяет GenericFilterBean, вызывается перед методом tryAuthentication в AbstractAuthenticationProcessingFilter
tryAuthentication AbstractAuthenticationProcessingFilter вызывается только для заказа 1, а не для заказа 2
, когда я изменил заказ, иначе он не работает.
как сделать так, чтобы разрешение работало для обоих?
/ * * ** Для EMP Id LDAP * / **
@Order(1)
@Configuration
public class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Override
@CrossOrigin
protected void configure(HttpSecurity http) throws Exception {
// disable caching
LOGGER.info("Configuring auth filter");
http.headers().cacheControl();
http.csrf().disable().authorizeRequests().antMatchers("/").permitAll()
.antMatchers(HttpMethod.POST, "/login").permitAll()
.anyRequest()
.authenticated().and()
.addFilterBefore(new JWTLoginFilter("/login", authenticationManager()), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
LOGGER.info("Establishing the Ldap Connection");
auth.ldapAuthentication().userSearchFilter(SEARCH_FILTER_STRING)
.userSearchBase(CONTEXT_SEARCH).contextSource().url(LDAPURI)
.managerDn(DN)
.managerPassword(new String(Base64.getDecoder().decode(PASSWORD_STRING))).and()
.groupSearchBase(GROUP_SEARCH_BASE_STRING).rolePrefix(ROLE_PREFIX_STRING)
.userSearchFilter(USERSEARCHFILTER_STRING);
}
}
/ * * Для электронной почты настраиваемая аутентификация * /
@Configuration
@Order(2)
public class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter{
@Override
@CrossOrigin
protected void configure(HttpSecurity http) throws Exception {
// disable caching
LOGGER.info("Configuring auth filter");
http.headers().cacheControl();
http.csrf().disable().authorizeRequests().antMatchers("/").permitAll()
.antMatchers(HttpMethod.POST, "/loginWD").permitAll()
.anyRequest()
.authenticated().and()
.addFilterBefore(new JWTLoginFilter("/loginWD", authenticationManager()), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
//.authenticationProvider(customAuthProvider);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
LOGGER.info("Establishing the Custom");
auth.authenticationProvider(customAuthProvider);
}
}
/ * * Общий фильтр аутентификации JWT * / **
public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter {
public JWTLoginFilter(String url, AuthenticationManager authenticationManager) {
super(new AntPathRequestMatcher(url));
setAuthenticationManager(authenticationManager);
tokenAuthenticationService = new TokenAuthenticationService();
}
@Override
public Authentication attemptAuthentication(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws AuthenticationException, IOException, ServletException {
LOGGER.info("Attempting Authentication....");
ServletInputStream res = httpServletRequest.getInputStream();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.AUTO_CLOSE_SOURCE, true);
User credentials = objectMapper.readValue(res, User.class);
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(credentials.getUserName(),
new String(Base64.getDecoder().decode(credentials.getPassword()))
);
return getAuthenticationManager().authenticate(token);
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
Authentication authentication) throws IOException, ServletException {
LOGGER.info(" After Successful Authentication with ...");
String name = authentication.getName();
LOGGER.info(" Adding Token in Headers......");
tokenAuthenticationService.addAuthentication(response, name); // Custom Service Class
}
}
@Component
public class JWTAuthenticationFilter extends GenericFilterBean { //
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
Authentication authentication = new TokenAuthenticationService().getAuthentication((HttpServletRequest) request);
SecurityContextHolder.getContext().setAuthentication(authentication);
filterChain.doFilter(request, response);
}
}