Привет всем, я неделями занимаюсь этой проблемой, делаю черный список чипов 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);
}