Включение AbstractAuthenticationProcessingFilter для аутентификации нескольких точек входа с Order - PullRequest
0 голосов
/ 10 апреля 2019

У меня проблема с включением 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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...