Может ли один JWT-токен быть доступным для всех пользователей в вызове остальных API - PullRequest
0 голосов
/ 28 февраля 2020

Я использовал токен 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();
}
...