Springboot統合token


前に書く
  • 前後のインタラクションでは、情報のセキュリティを保証するために、ユーザー検証を追加する必要があります.この論文ではspringbootを用いてtokenを簡単に統合することを紹介した.
  • springbootバージョン2.2.0.また主にjjwt,redisを用いた.この文書を読むには、7~10分かかります.
  • 統合token
    1.依存関係のインポート
    pom.xmlファイル
    
            
                io.jsonwebtoken
                jjwt
                0.9.0
            

    2.TokenUtil.JAva実装生成/解析token
    package com.dbc.usermanager.util;
    
    import com.dbc.usermanager.service.RedisService;
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.JwtBuilder;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
    import java.security.Key;
    import java.util.Date;
    
    public class TokenUtil {
        /**
         *     ,          
         */
        public static final String SECRET = "DaTiBao";//  :        ,               0,    
        /**
         *    
         */
        public static final String issuer  = "dtb.com";
        /**
         *     
         */
        public static final long ttlMillis = 3600*1000*60;
    
        /**
         *   token
         *
         * @param id     userName
         * @return
         */
        public static String createJwtToken(String id,String subject) {
            return createJwtToken(id, issuer, subject, ttlMillis);
        }
        public static String createJwtToken(String id) {
            return createJwtToken(id, issuer, "", ttlMillis);
        }
    
        /**
         *   Token
         *
         * @param id          
         * @param issuer     JWT    ,        
         * @param subject    JWT      ,        ;
         * @param ttlMillis      (    ,     )
         * @return token String
         */
        public static String createJwtToken(String id, String issuer, String subject, long ttlMillis) {
    
            //      ,  token    
            SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
    
            //       
            long nowMillis = System.currentTimeMillis();
            Date now = new Date(nowMillis);
    
            //       JWT
            byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);
            String str=signatureAlgorithm.getJcaName();
            Key signingKey = new SecretKeySpec(apiKeySecretBytes, str);
    
            //      JWT  
            JwtBuilder builder = Jwts.builder().setId(id)
                    .setIssuedAt(now)
                    .setSubject(subject)
                    .setIssuer(issuer)
                    .signWith(signatureAlgorithm, signingKey);
    
            // if it has been specified, let's add the expiration
            if (ttlMillis >= 0) {
                //    
                long expMillis = nowMillis + ttlMillis;
                Date exp = new Date(expMillis);
                builder.setExpiration(exp);
            }
    
            //   JWT            url     
            return builder.compact();
    
        }
    
        /**
         * Token    
         * @param jwt Token
         * @return
         */
        public static Claims parseJWT(String jwt) {
            //            JWS(   ),        
            Claims claims = Jwts.parser()
                    .setSigningKey(DatatypeConverter.parseBase64Binary(SECRET))
                    .parseClaimsJws(jwt).getBody();
            return claims;
        }
    
    
        public static void main(String[] args) {
    
            String token = TokenUtil.createJwtToken("2","ltz");
    
            System.out.println(TokenUtil.createJwtToken("2","ltz"));
    
            Claims claims = TokenUtil.parseJWT(token);
    
            System.out.println(claims);
    
        }
    }
    

    3.ログイン検証の注釈を追加@LoginRequired
    package com.dbc.usermanager.util;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    //     ,   token
    @Target({ElementType.METHOD, ElementType.TYPE})//             
    @Retention(RetentionPolicy.RUNTIME)//      
    public @interface LoginRequired {
        boolean required() default true;
    }

    4.テスト
        @PostMapping(value = "test")
        @ApiOperation(value="  token")
        public ResultJson test(@RequestBody JSONObject requestJson){
            String token= TokenUtil.createJwtToken("1","dtb");
            redisService.set(token,"1");
            return new ResultJson(0,"    ",null);
        }
        @GetMapping(value = "getToken")
        @LoginRequired
        @ApiOperation("")
        public ResultJson getToken(String token){
            if(redisService.exists(token)){
                System.out.println(redisService.get(token));
            }
            return new ResultJson(0,"    ",null);
        }

    最後に
  • エンティティークラスUser.JAvaなどの関連書類は貼らないので、自分で書いた実体クラスで書くことができます.
  • 多くのステップと思想はコードの中で体現されており、コードにも多くの注釈が追加されており、自分のニーズに応じて削除して変更することができます.