Как аутентифицировать токен JWT в том же фильтре, который использовался для генерации токена - PullRequest
0 голосов
/ 30 марта 2020

Я работаю над Spring Security, поэтому у меня возникают проблемы при проверке последующих запросов с помощью сгенерированного токена.

Насколько я знаю, когда пользователь вошел в систему и токен был сгенерирован для каждого последующего запроса как я должен проверить токен.

Я в основном имею в виду, что в классе ниже он успешно сгенерировал токен, и я добавил повара ie в ответ только для целей тестирования. Пожалуйста, посмотрите ниже класс.

package com.example.demo;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    private AuthenticationManager authenticationManager;

    private static final Logger log=Logger.getAnonymousLogger();

    public AuthenticationFilter(AuthenticationManager autheticationManager) {
        this.setAuthenticationManager(autheticationManager);
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
            throws AuthenticationException {

        /*
         * List list = new ArrayList<GrantedAuthority>(); GrantedAuthority auth = ()-> {
         * return "USER"; };
         * 
         * list.add(auth.getAuthority());
         */
        return getAuthenticationManager().authenticate(
                new UsernamePasswordAuthenticationToken("user", "password"));
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
            Authentication authResult) throws IOException, ServletException {
        response.addHeader("Token", "Logged in");
        HttpSession session = request.getSession();
        Cookie cookies = new Cookie("token", "True");
        cookies.setMaxAge(60);
        session.setAttribute("cookie", cookies);
        log.log(Level.INFO, "Authentication Successull Cookies has been added to the session Context");
    }

}

Теперь, дальнейшие запросы должны будут go через метод doFilterInternal, если я не ошибаюсь ?. Итак, отсюда я могу проверить токен для аутентификации запроса и решу, должен он пройти или нет. Чтобы переопределить этот метод, мне нужно будет расширить класс OncePerRequestFilter или BasicAuthenitcation, но в java мы ограничены и можем расширять только один класс.

Если мы собираемся реализовать интерфейс и интерфейс мы можем реализовать класс, тогда это также невозможно, потому что требуемые классы являются абстрактными, поэтому реализовать их в интерфейсе будет невозможно.

Если мы создадим другой класс для реализации этого класса с помощью метода doFilterInternal, тогда нам нужно будет добавить это как фильтр в класс WebSecurityConfig, но, как мы все знаем, он может добавить только один фильтр.

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests().antMatchers("/**")
        .hasRole("USER").and().formLogin()
        .and().addFilter(getAuthenticationFilter());
    }

Так что я не понимаю, что делать на этом этапе. пожалуйста, предложите что-нибудь.

1 Ответ

0 голосов
/ 30 марта 2020

Мне удалось это исправить. Мы можем сгенерировать токены и проверить их в том же классе, нам не нужны никакие другие API, потому что если вы используете архитектуру микро-сервисов, вам придется много путаться.

Итак, я создал собственный класс Filter ниже.

AutheticationFilter.class

package com.example.demo;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

public class AuthenticationFilter extends AbstractAuthenticationProcessingFilter {

    private static final Logger log=Logger.getAnonymousLogger();

    protected AuthenticationFilter(AuthenticationManager authenticationManager) {
        super(new AntPathRequestMatcher("/login", "POST"));
        this.setAuthenticationManager(authenticationManager);
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
            throws AuthenticationException {

        String user = request.getParameter("username");
        String password = request.getParameter("password");
        log.log(Level.INFO, "Username from the Request: "+user);
        log.log(Level.INFO, "Password from the request: "+password);

        /*
         * List list = new ArrayList<GrantedAuthority>(); GrantedAuthority auth = ()-> {
         * return "USER"; };
         * 
         * list.add(auth.getAuthority());
         */
        return getAuthenticationManager().authenticate(
                new UsernamePasswordAuthenticationToken("user", "password"));
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("Do filter authentication filter invoked");
        super.doFilter(req, res, chain);
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
            Authentication authResult) throws IOException, ServletException {
        System.out.println("Authentication Successull Cookies has been added to the session Context");
        response.addHeader("Token", "Logged in");
        HttpSession session = request.getSession();
        Cookie cookies = new Cookie("token", "True");
        cookies.setMaxAge(60);
        session.setAttribute("cookie", cookies);
        log.log(Level.INFO, "Authentication Successull Cookies has been added to the session Context");
    }

}

Добавьте этот фильтр в свой класс конфигурации, используя метод add filter before method Http Security.

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