JWT +インターセプターの単純なログイン認証

1.増やし依存JWT

       <依存性> 
            <のgroupId> com.auth0 </のgroupId> 
            <たartifactId>のJava JWT </たartifactId> 
            <バージョン> 3.8.1 </バージョン> 
        </依存>

 2.JWTツール

パブリック クラスTokenUtil {
     // トークン鍵
    プライベート 静的な 最終文字列TOKEN_SECRET = "27f56a1ca0a347618ff39c7fdf9ab684" ;
     // 15分のタイムアウト時間
    プライベート 静的 最終 長い Out_timeを* = 1000 60 * 150 ; 

    プライベート 静的ロガーLoggerFactory.getLogger =ログ(。TokenUtilのクラス) ; 


    / * 暗号化
     * @param のuserId 
     * @return 
     * / 
    パブリック 静的{文字列の記号(文字列のuserId)を
         してみてください {
            日EXPIRATION_TIME= 新しい日付(のSystem.currentTimeMillis()+ Out_timeまで)。
            アルゴリズムアルゴリズム = Algorithm.HMAC256(TOKEN_SECRET)。
            地図 headerMap = <文字列は、オブジェクト> 新しい HashMapを<>(2 ); 
            headerMap.put( "タイプ"、 "JWT" )。
            headerMap.put( "ALG"、 "HS256" )。
            返す。JWT.create()withHeader(headerMap).withClaim( "はuserId" 、USERID).withExpiresAt(EXPIRATION_TIME).sign(アルゴリズム)。
        } キャッチ(例外e){ 
            log.error(e.getMessage())。
            リターン ヌル
        } 
    } 


    / ** 解密
     * @paramのトークン
     * @return 
     * / 
    パブリック 静的地図の<string、請求項> verifyToken(文字列トークン){ 
        DecodedJWT decodedJWT = NULL ;
        試す{ 
            JWTVerifier検証 = JWT.require(Algorithm.HMAC256(TOKEN_SECRET))(ビルド)。
            decodedJWT = verifier.verify(トークン)。
            log.info( "超时时间:" + decodedJWT.getExpiresAt()); 
            log.info( "载体信息:" + decodedJWT.getClaim( "userIdを").asString())。 
            log.info( "アルゴリズム:" + decodedJWT.getAlgorithm()); 
        } キャッチ(例外E){
           // デコード例外がスローされ
            log.error(e.getMessage());
             リターン NULL ; 
        } 
        戻りdecodedJWT.getClaims(); 
    } 
}

前記インターセプタは、要求をインターセプトし、springboot注入インターセプタ

@Component
 パブリック クラス TokenInterceptorが実装HandlerInterceptor {
    プライベート    ロガーロガー= LoggerFactory.getLogger(TokenInterceptor クラス)。

    @Override 
    パブリック ブール preHandleは(HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクト・ハンドラ)スロー例外{ 
        文字列トークン = request.getHeader( "トークン" )。
        // トークン验证
        場合(!StringEmpty.IsEmpty(トークン)){ 
            地図 <文字列、請求> claimMap = TokenUtil.verifyToken(トークン)。
            もし claimMap(!=ヌル){
                 // アカウントの操作... 
                返す trueに; 
            } {
                 // 検証エラーは、エラーページにジャンプ 
                Response.sendRedirect(request.getContextPath()+ "/ twjd /エラー" );
                を返す falseに; 
            } 
        } 
        リターン falseに; 
    } 
}

 

@Configuration
 パブリック クラス InterceptorConfigは   実装WebMvcConfigurer { 
    @Autowired 
    プライベートTokenInterceptor tokenInterceptorを。


    @Override 
    公共 ボイドaddInterceptors(InterceptorRegistryレジストリ){ 
        InterceptorRegistration登録 = registry.addInterceptor(tokenInterceptor)。
        // 拦截配置 
        registration.addPathPatterns( "/ twjd / **" );
        // 排除配置 
        registration.excludePathPatterns( "/ twjd /ログイン"、 "/ twjd /エラー" ); 
    } 
}

4.ユーザーログイン操作は、認証トークンを運ぶためにならば、ユーザは、トークン運ぶことを確認してください

    / ** 
     *用户登陆
     * 
     * @param用のsysusers 
     * @paramのリクエスト
     * @paramの応答
     * @return 
     * / 
    @RequestMapping(値 = "/ログイン"、メソッド= RequestMethod.POST)
    @ResponseBody 
    公共のHashMap <文字列、文字列> ログイン(SYSUSERのsysusers、HttpServletRequestのリクエスト、HttpServletResponseの応答){ 
        SYSUSERユーザー = logService.getUser(sysusers.getName())。
        HashMapの tokenMap = <文字列、文字列> 新規のHashMap <>(1 )。
        //ユーザーおよび発行されたパスワードに保存されているが正しいトークンである
        IFヌル!=ユーザー&& user.getPassword()。等号(sysusers.getPassword())){
             IF(!StringEmpty.IsEmpty(user.getPassword())){ 
                response.setHeader ( "トークン" 、TokenUtil.sign(user.getID())); 
                tokenMap.put( "トークン" 、TokenUtil.sign(user.getID()));
                 // 一日の有効期限のRedisに設定記憶されている
                IF( !redisUtil.exists(sysusers.getName())){ 
                    logger.info( "アクティブユーザ+1しました:" + sysusers.getName()); 
                    redisUtil.set(sysusers.getName()、のsysusers、1、TimeUnit.DAYS) ;
                }
                戻りtokenMapを; 
            } 
        } { 
            tokenMap.put( "トークン"、 "ユーザ不在" ); 
        } 
        戻り、tokenMapを
    }

 

おすすめ

転載: www.cnblogs.com/yq-cc/p/11320324.html