Сделайте токены JWT из черного списка для весенней загрузки

Привет всем, я неделями занимаюсь этой проблемой, делаю черный список чипов JWT с весенней загрузкой вот что я сделал, когда пользователь пытается отключить свое хранилище, его токен ключа в данной базе данных mongoDB, и он работает

@PutMapping(value = "/destroy", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public JwtBlacklist logout(@RequestBody Map<String,String> json, HttpSession httpSession) throws UnsupportedEncodingException {

    String token = json.get("token");

    JwtBlacklist jwtBlacklist = new JwtBlacklist();
    jwtBlacklist.setToken(token);
    jwtBlacklistRepository.save(jwtBlacklist);

    return jwtBlacklistRepository.save(jwtBlacklist);
}   

Он отлично хранит ключ в данной базе данных, не беспокоясь, вот изображения https://ibb.co/dcX0Vnh "tokenStore"

Теперь самая большая проблема заключается в том, что я пытаюсь внести в черный список токены, которые пользователь должен использовать во время своего подключения, и когда он отключает этот токен, здесь больше не действует код I JWTFilter.java

public class JWTFilter extends GenericFilterBean {
    @Value("${app.jwtSecret}")
    public String jwtsecret;
    @Autowired
    public JwtBlacklistRepository jwtBlacklistRepository;

    @Override
    public void doFilter(final ServletRequest req,
                         final ServletResponse res,
                         final FilterChain chain) throws IOException, ServletException {

        final HttpServletRequest request = (HttpServletRequest) req;
        final HttpServletResponse response = (HttpServletResponse) res;
        final String authHeader = request.getHeader("authorization");

        if ("OPTIONS".equals(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);

            chain.doFilter(req, res);
        } else {

            if (authHeader == null || !authHeader.startsWith("Bearer ")) {
                throw new ServletException("Missing or invalid Authorization header");
            }

            final String token = authHeader.substring(7);
            JwtBlacklist blacklist = this.jwtBlacklistRepository.findByTokenEquals(token);

                    if(blacklist == null) {
                        final Claims claims = Jwts.parser().setSigningKey("topsecretjwtpass".getBytes(StandardCharsets.UTF_8)).parseClaimsJws(token).getBody();
                        request.setAttribute("claims", claims);
                    } else {
                        throw new ServletException("Invalid token." + "");

                    }

            chain.doFilter(req, res);
        }

    }
} 

Теперь, когда я пытаюсь сделать запрос с токенами черного списка или без токенов черного списка, у меня появляется эта ошибка

Вот модель


Это репозиторий JwtBlacklist

public class JwtBlacklist {
    @Id
    private String _id;
    @Indexed(direction = IndexDirection.ASCENDING)
    private String token;

    public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    @Override
    public String toString() {
        return "JwtBlacklist{" +
                "_id='" + _id + '\'' +
                ", token='" + token + '\'' +
                '}';
    }
}

Подводя итог, проблема возникает из-за того, что ваш JWTFilter не управляется Spring, поэтому вы не можете просто попросить его внедрить bean-компоненты и свойства за вас.


import com.monarque.bank.monarque.dao.models.JwtBlacklist;
import org.springframework.data.mongodb.repository.MongoRepository;


public interface JwtBlacklistRepository extends MongoRepository<JwtBlacklist,String> {


JwtBlacklist findByTokenEquals(String token);

}

person Taylor Marshall    schedule 27.08.2019    source источник
comment
вы можете привести пример, чтобы я мог лучше понять   -  person Brother    schedule 28.08.2019
comment
привет @ taylor-marshall только что добавил ответ   -  person Taylor Marshall    schedule 28.08.2019
comment
Я на несколько недель застрял в глубокой темноте весенних сапог, и ты пришел избавить меня из этого ада, мой черный рыцарь. Спасибо   -  person Brother    schedule 29.08.2019


Ответы (2)


К счастью для вас, есть простой способ заставить все работать!

Попробуйте и посмотрите, работает ли для вас добавление следующего метода инициализации:

В этом методе попросите пружину сделать инъекцию за вас.

public class JWTFilter extends GenericFilterBean {
  @Value("${app.jwtSecret}")
  public String jwtsecret;
  @Autowired
  public JwtBlacklistRepository jwtBlacklistRepository;

  //ask spring to inject the values based on current context
  @PostConstruct
  public void init() {
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
  }

  @Override
  public void doFilter(final ServletRequest req,
                       final ServletResponse res,
                       final FilterChain chain) throws IOException, 
  ServletException {

  ....
  }
}

Эта ошибка возникает из-за того, что вы работаете с фильтрующим компонентом, и внедрение компонента в GenericFilter не работает. Один из известных мне способов обойти эту проблему - это ленивая загрузка вашего репозитория.

person Brother    schedule 29.08.2019
comment
@TaylorMarshall Рад, что смог так сильно помочь =) - person Taylor Marshall; 29.08.2019
comment
Спасибо, что ответили так быстро, я пробую ваш метод, он работает для токена jwt из черного списка, его прогулка, а не его, не находят токены, внесенные в черный список - person Brother; 29.08.2019

Просто проверьте первую строку doFilter (), если ваш репозиторий равен нулю, если да, получите свой servletContext и лениво загрузите его. Например:

В основном вы заставляете загружать этот bean-компонент в свой фильтр. (Пожалуйста, поправьте меня, если я ошибаюсь в этом утверждении).

if (jwtBlacklistRepository == null) { //Lazy Load because filter
    ServletContext servletContext = req.getServletContext();
    WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
    jwtBlacklistRepository = webApplicationContext.getBean(JwtBlacklistRepository.class);
}

Привет, вместо использования @Autowired внутри JWTFilter вы должны получить это как конструктор и передать его внутри, где вы создаете экземпляр JWTFilter. Наверное, в SecurityConfig или что-то в этом роде. Другой вариант - сделать JWTFilter компонентом, тогда автосоединение будет работать

person Markus G.    schedule 27.08.2019
comment
пожалуйста, вы можете создать код, чтобы узнать, какой ключ находится в черном списке или нет в JWTFilter.java, это будет супер круто и мило с вашей стороны - person Taylor Marshall; 27.08.2019
comment
Извините, мне это трудно понять, потому что английский не мой родной язык и, я думаю, не ваш. Можете ли вы перевести через deepl.com/translator, пожалуйста. Трудно понять ваш первый комментарий. - person Taylor Marshall; 27.08.2019
comment
Верно ли, что ваш токен не найден в репозитории черного списка JWT? Как выглядит ваша модель и репозиторий? И почему вы заставляете .substring (7) с токеном. - person Markus G.; 27.08.2019
comment
Лол заметил, что мой английский на самом деле плохой, я говорю по-французски, поэтому я попробовал ваш метод, и он работает, проблема в том, что вы не можете знать токены из черного списка, если вы можете сделать полный код человека, это будет супер круто с вашей стороны - person Markus G.; 27.08.2019
comment
Спасибо также за вашу помощь ❤️ - person Taylor Marshall; 27.08.2019
comment
{"timestamp": "2019-08-27T11: 54: 52.063 + 0000", "status": 500, "error": "Внутренняя ошибка сервера", "message": "Сообщение недоступно", "trace": " java.lang.NullPointerException \ n \ tat com.monarque.bank.monarque.config.JWTFilter.doFilter (JWTFilter.java:47) \ n \ tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter19 (ApplicationFilterChain.internalDoFilter: ) \ n \ tat org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterjChain:20) tat org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke (FilterSecurityInterceptor.java:127) \ n \ tat org.springframework.security.web.access.intercept.FilterSecurityInterceptor. n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ n \ tat org.springframework.security.web.access.ExceptionTranslationF ilter.doFilter (ExceptionTranslationFilter.java:119) \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ n \ tat org.springframework.security doFilter (SessionManagementFilter.java:137) \ n \ tat org.springframework.security.web. AnonymousAuthenticationFilter.java:111)\n\tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ nConConnect. java: 170) \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ n \ tat org.springframework.security.web.savedrequest.RequestCacheFilterAwareFilter ( CacheAwareFilter.java:63)\n\tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ n \ tat org.springframework.security.web.authentication.log ( LogoutFilter.java:116)\n\tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ n \ tat org.springframework.security.web.header. java: 74) \ n \ tat org.springframework.web.filter. OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ n \ tatsupport. doFilter (SecurityContextPersistenceFilter.java:105) \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ n \ tat org.springframework.context.web. WebAsyncManagerIntegrationFilter.doFilterInternal (WebAsyncManagerIntegrationFilter.java:56) \ n \ tat org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107 или FilterChainProxy.java:334)\n\tat org.springframework.security.web.FilterChainProxy.doFilterInternal (FilterChainProxy.java:215) \ n \ tat org.springframework.security.web.FilterChainProxy. \ n \ tat org.spr ingframework.web.filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy.java:357) \ n \ tat org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilterProxy.java.doFilter (DelegatingFilterProxy.java:270) \ napal. ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) \ n \ tat org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ n \ tat org.springframework.web.Confilter.ConnectFilter.Filter.ConnectFilter.ConnectFilter.Filter.ConnectFilter.ConnectFilter.Filter.ConnectFilter.ConnectFilter.ConnectFilter.ConnectFilter.ConnectFilter.ConnectFilter.Fil java. \ tat org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ n \ tat org.springframework.web.filter.FormContentFilter.doFilterInternal (FormContentFilter.java:92 orgwork.s \ n web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter .java: 107) \ n \ tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) \ n \ tat org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain) \ java n \ tat org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal (HiddenHttpMethodFilter.java:93) \ n \ tat org.springframework.web.filter.OncePerRequestFilter10.doFilter.OncePerRequestFilter10.doFilter. .catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) \ n \ tat org.apache.catalina.core. ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ n \ tat org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal (SessionRepositoryFilter.java:151) \ n \ tat org.springframework.framework.spring.framework.spring. doFilter (OncePerRequestFilter.java:81) \ n \ tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) \ n \ tat org.apache.catalina.core.ApplicationFilterChain.doFilterChain.do 166) \ n \ tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:200) \ n \ tat org.springframework.web.filter.OncePerRequestFilter10.doFilter. org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) \ n \ tat org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ n \ tat org. core.StandardWrapperValve.invoke (StandardWrapperValve.java:2 00) \ n \ tat org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:96) \ n \ tat org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:490) \ n \ tat org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:139) \ n \ tat org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:92) \ n \ tat org.apache.catalina. core.StandardEngineValve.invoke (StandardEngineValve.java:74) \ n \ tat org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:343) \ n \ tat org.apache.coyote.http11.Http11 ( Http11Processor.java:408)\n\tat org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) \ n \ tat org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:834) \ n \ tat org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1415) \ n \ tat org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) \ n \ tat java.base / java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128) \ n \ tat java.base / java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java \ tatsupport.java \ t628) или tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) \ n \ tat java.base / java.lang.Thread.run (Thread.java:835) \ n "," путь ":" / v1 / users / fa26eea5-7dce-4d79-a7f7-1f848cc58966 "} - person Taylor Marshall; 29.08.2019