2016-06-01 11 views
1

私はJSONウェブトークンが取り消されたことを/​​時間の設定可能なammount後に期限切れ確保したいと私は、次の設定があります。Spring MVCの+ AngularJS + JWTトークンの有効期限 - 手引き

セキュリティフィルタ:

を認証トークンを作成し
import io.jsonwebtoken.Claims; 
import io.jsonwebtoken.Jwts; 
import yourwebproject2.service.UserService; 
import org.apache.commons.lang.StringUtils; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.filter.OncePerRequestFilter; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Pattern; 

/** 
* @author: kameshr 
*/ 
public class JWTTokenAuthFilter extends OncePerRequestFilter { 
    private static List<Pattern> AUTH_ROUTES = new ArrayList<>(); 
    private static List<String> NO_AUTH_ROUTES = new ArrayList<>(); 
    public static final String JWT_KEY = "JWT-TOKEN-SECRET"; 

    static { 
     AUTH_ROUTES.add(Pattern.compile("/api/*")); 
     NO_AUTH_ROUTES.add("/api/user/authenticate"); 
     NO_AUTH_ROUTES.add("/api/user/register"); 
    } 

    private Logger LOG = LoggerFactory.getLogger(JWTTokenAuthFilter.class); 

    @Autowired 
    private UserService userService; 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, 
            FilterChain filterChain) throws ServletException, IOException { 
     String authorizationHeader = request.getHeader("authorization"); 
     String authenticationHeader = request.getHeader("authentication"); 
     String route = request.getRequestURI(); 

     // no auth route matching 
     boolean needsAuthentication = false; 

     for (Pattern p : AUTH_ROUTES) { 
      if (p.matcher(route).matches()) { 
       needsAuthentication = true; 
       break; 
      } 
     } 

     if(route.startsWith("/api/")) { 
      needsAuthentication = true; 
     } 

     if (NO_AUTH_ROUTES.contains(route)) { 
      needsAuthentication = false; 
     } 

     // Checking whether the current route needs to be authenticated 
     if (needsAuthentication) { 
      // Check for authorization header presence 
      String authHeader = null; 
      if (authorizationHeader == null || authorizationHeader.equalsIgnoreCase("")) { 
       if (authenticationHeader == null || authenticationHeader.equalsIgnoreCase("")) { 
        authHeader = null; 
       } else { 
        authHeader = authenticationHeader; 
        LOG.info("authentication: " + authenticationHeader); 
       } 
      } else { 
       authHeader = authorizationHeader; 
       LOG.info("authorization: " + authorizationHeader); 
      } 

      if (StringUtils.isBlank(authHeader) || !authHeader.startsWith("Bearer ")) { 
       throw new AuthCredentialsMissingException("Missing or invalid Authorization header."); 
      } 

      final String token = authHeader.substring(7); // The part after "Bearer " 
      try { 
       final Claims claims = Jwts.parser().setSigningKey(JWT_KEY) 
         .parseClaimsJws(token).getBody(); 
       request.setAttribute("claims", claims); 

       // Now since the authentication process if finished 
       // move the request forward 
       filterChain.doFilter(request, response); 
      } catch (final Exception e) { 
       throw new AuthenticationFailedException("Invalid token. Cause:"+e.getMessage()); 
      } 
     } else { 
      filterChain.doFilter(request, response); 
     } 
    } 
} 

方法:私はJWTに使用していますすべての請求を持っている上

String token = Jwts.builder().setSubject(user.getEmail()) 
       .claim("role", user.getRole().name()).setIssuedAt(new Date()) 
       .signWith(SignatureAlgorithm.HS256, JWTTokenAuthFilter.JWT_KEY).compact(); 
     authResp.put("token", token); 
     authResp.put("user", user); 

、私はトークンをx弾薬の後に取り消されていることを要求したいと思います時間の無駄(可能であれば非活動)。私は、トークン

String token = Jwts.builder() 
    .setSubject(user.getEmail()) 
    .claim("role", user.getRole().name()) 
    .setIssuedAt(new Date()) 
    .setExpiration(expirationDate) 
    .signWith(SignatureAlgorithm.HS256, WTTokenAuthFilter.JWT_KEY) 
    .compact(); 

ため、この使用してJWT/Spring MVCの/アンギュラJS /春のセキュリティ

答えて

2

セットの有効期限を達成できる方法

parseClaimsJwsExpiredJwtExceptionを発生させますCURRENTTIME> EXPIRATIONDATE

するかの有効なトークンを取り消すことは簡単な解決法がない難しいテクニックです:

1)sでブラックリストを維持するERVERと各要求

2)acomplishあなたの基準 が)でJWTを削除する場合は、新しいトークン

3)トークンにログイン時間を挿入し、比較小さな有効期限を設定し、発行のための比較クライアント側

Ser Invalidating client side JWT session

関連する問題