Я использовал токен JWT в своем весеннем приложении. Я создал токен для каждого клиента, передавая имя пользователя и пароль в качестве параметра для создания токена, но этот токен доступен всем пользователям.
Например: Клиент 3 должен получить свои данные http://example.com/api?customer=3
Клиент 3 должен передать токен в заголовке, и он может получить доступ к этому URL.
Но этот же токен можно использовать для получения других данных о клиентах `http://example.com/api?customer=4
Как мне это ограничить?
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {
try {
String jwt = getJwt(request);
if (jwt!=null && jwtProvider.validateJwtToken(jwt)) {
String username = jwtProvider.getUserNameFromJwtToken(jwt);
UserDetails userDetails = userService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authentication
= new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (Exception e) {
logger.error("Can NOT set user authentication -> Message: {}", e.getMessage());
}
filterChain.doFilter(request, response);
}
private String getJwt(HttpServletRequest request) {
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
return authHeader.replace("Bearer ","");
}
return null;
}
public String generateJwtToken(Authentication auth) {
UserPrinciple userPrinciple = (UserPrinciple) auth.getPrincipal();
return Jwts.builder()
.setSubject(userPrinciple.getUsername())
.setIssuedAt(new Date())
.setExpiration(expiryDate())
.signWith(SignatureAlgorithm.HS512, "secretKey")
.compact();
}
public Date expiryDate() {
return new Date((new Date()).getTime() + 15 * 60 * 1000);
}
public boolean validateJwtToken(String authToken) {
try {
Jwts.parser().setSigningKey("secretkey").parseClaimsJws(authToken);
return true;
} catch (SignatureException e) {
logger.error("Invalid JWT signature -> Message: {} ", e.getMessage());
} catch (MalformedJwtException e) {
logger.error("Invalid JWT token -> Message: {}", e.getMessage());
} catch (ExpiredJwtException e) {
logger.error("Expired JWT token -> Message: {}", e.getMessage());
} catch (UnsupportedJwtException e) {
logger.error("Unsupported JWT token -> Message: {}", e.getMessage());
} catch (IllegalArgumentException e) {
logger.error("JWT claims string is empty -> Message: {}", e.getMessage());
}
return false;
}
public String getUserNameFromJwtToken(String token) {
return Jwts.parser()
.setSigningKey("secretKey")
.parseClaimsJws(token)
.getBody().getSubject();
}