亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

spring security結(jié)合jwt實現(xiàn)用戶重復(fù)登錄處理

 更新時間:2022年03月24日 16:20:28   作者:小石頭的掘金  
本文主要介紹了spring security結(jié)合jwt實現(xiàn)用戶重復(fù)登錄處理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

背景

近日,客戶針對我司系統(tǒng)做一些列漏洞掃描,最后總結(jié)通用漏洞有如下:

  • 用戶重復(fù)登錄
  • 接口未授權(quán)
  • 接口越權(quán)訪問

針對以上漏洞,分三篇文章分別記錄解決方案,供后續(xù)回憶學(xué)習(xí),本文先處理用戶重復(fù)登錄漏洞

方案

系統(tǒng)采用spring boot搭建,spring security+ jwt 作為安全框架

  • 用戶登錄成功 生成token給到用戶, 同時存儲到redis中(key值為用戶名(標(biāo)識)) value為生成的token
  • 用戶再次訪問系統(tǒng)請求參數(shù)中帶有token信息 后臺通過過濾器進(jìn)行攔截進(jìn)行比對
  • 如果token匹配成功 就放行 匹配不成功 說明兩個token不一致 開始比對對應(yīng)的時間戳 后者時間戳 大于前者就把當(dāng)前token覆蓋(如果舊的token請求再次進(jìn)來 期時間戳就晚于當(dāng)前redis中的token時間(token已經(jīng)更新)判斷其為被踢出的用戶提示重新登錄)

思路圖

核心代碼

  • 配置過濾器

  • 過濾器實現(xiàn)

RepeatLoginFilter.java

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String jwt = resolveToken(request);
    //重復(fù)登錄只校驗帶有合法jwt的  放過驗證碼以及免鑒權(quán)的那些請求
    if (null == jwt || "null".equalsIgnoreCase(jwt) || !this.tokenProvider.validateToken(jwt)) {
        filterChain.doFilter(request, response);
        return;
    }

    if (isAccessAllowed(jwt)) {
        filterChain.doFilter(request, response);
        return;
    }

    // 賬號重復(fù)登錄,跳轉(zhuǎn)登錄頁面 logout
    logout(response);
}

/**
 * 重復(fù)登錄核心校驗
 * @param token 當(dāng)前token
 * @return true通過放行 
 */
private boolean isAccessAllowed(String token) {
    Authentication authentication = this.tokenProvider.getAuthentication(token);
    String redisToken = redisTemplate.opsForValue().get(Constants.PREFIX_LOGIN_USER+authentication.getName());
    //redisToken為空 說明第一次登陸 放過并加入redis
    if(!StringUtils.hasLength(redisToken)){
        redisTemplate.opsForValue().set(Constants.PREFIX_LOGIN_USER+authentication.getName(),token,
          86400, TimeUnit.SECONDS);
        return true;
    }
    //redis token和當(dāng)前token一致  說明是當(dāng)前登陸用戶訪問  放過
    if(token.equals(redisToken)){
        return true;
    }
    //redis token和當(dāng)前token不一致,比較兩個token的創(chuàng)建時間,如果當(dāng)前token大于redistoken 就說當(dāng)前是最新的,放入redis并放過
    //否則就說明redis里已有最新的token,當(dāng)前token應(yīng)該過期,不放行
    Date date = this.tokenProvider.getIssueAt(token);
    Date redisDate = this.tokenProvider.getIssueAt(redisToken);
    if(date.after(redisDate)){
        redisTemplate.opsForValue().set(Constants.PREFIX_LOGIN_USER+authentication.getName(),token,
          86400, TimeUnit.SECONDS);
        return true;
    }else{
        return false;
    }

}

/**
* 獲取jwt
/
private String resolveToken(HttpServletRequest request) {
    String bearerToken = request.getHeader("Authorization");
    if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
        return bearerToken.substring(7);
    }
    return null;
}

/**
 * 返回退出信息到前臺
 * @param response
 */
private void logout(HttpServletResponse response){
    response.setStatus(HttpStatus.FORBIDDEN.value());
    response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
    try {
        JSONObject resultObj = new JSONObject();
        resultObj.putOnce("data","賬號已在別的地方登錄,請重新登錄");
        response.getWriter().print(resultObj.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

到此這篇關(guān)于spring security結(jié)合jwt實現(xiàn)用戶重復(fù)登錄處理的文章就介紹到這了,更多相關(guān)spring security jwt重復(fù)登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于maven install 沒反應(yīng)的解決方法

    基于maven install 沒反應(yīng)的解決方法

    下面小編就為大家?guī)硪黄趍aven install 沒反應(yīng)的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 高效的java版排列組合算法

    高效的java版排列組合算法

    這篇文章主要為大家詳細(xì)介紹了高效的java版排列組合算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Spring Boot配置application.yml及根據(jù)application.yml選擇啟動配置的操作方法

    Spring Boot配置application.yml及根據(jù)application.yml選擇啟動配置的操作

    Spring Boot中可以選擇applicant.properties 作為配置文件,也可以通過在application.yml中進(jìn)行配置,讓Spring Boot根據(jù)你的選擇進(jìn)行加載啟動配置文件,本文給大家介紹Spring Boot配置application.yml及根據(jù)application.yml選擇啟動配置的操作方法,感興趣的朋友一起看看吧
    2023-10-10
  • 關(guān)于java中線程安全問題詳解

    關(guān)于java中線程安全問題詳解

    最近工作中遇到不少多線程問題,但自己一直對多線程的理解比較表層,所以深入研究了一番,下面這篇文章主要給大家介紹了關(guān)于java中線程安全問題的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • hibernate關(guān)于session的關(guān)閉實例解析

    hibernate關(guān)于session的關(guān)閉實例解析

    這篇文章主要介紹了hibernate關(guān)于session的關(guān)閉實例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • java 方法與數(shù)組基礎(chǔ)使用詳解

    java 方法與數(shù)組基礎(chǔ)使用詳解

    Java語言中的“方法”(Method)在其他語言當(dāng)中也可能被稱為“函數(shù)”(Function),數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對數(shù)組的實現(xiàn)及處理也不盡相同。Java 語言中提供的數(shù)組是用來存儲固定大小的同類型元素
    2022-04-04
  • java實現(xiàn)租車系統(tǒng)

    java實現(xiàn)租車系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)租車系統(tǒng),以及遇到的兩個問題解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java中的Native關(guān)鍵字講解

    Java中的Native關(guān)鍵字講解

    本文介紹了Java中的Native關(guān)鍵字,native關(guān)鍵字是架起本機語言和JAVA之間鴻溝的橋梁。如果我們的軟件與硬件的交互在使用預(yù)先存在的代碼時更有效,那么這可以作為一個關(guān)鍵環(huán)節(jié)。與從頭開始設(shè)計新的應(yīng)用程序代碼相比,只要可以避免,它就可以使實現(xiàn)工作更少,下面來了解集體內(nèi)容
    2021-12-12
  • IDEA2020如何打開Run Dashboard的方法步驟

    IDEA2020如何打開Run Dashboard的方法步驟

    這篇文章主要介紹了IDEA2020如何打開Run Dashboard的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java使用wait() notify()方法操作共享資源詳解

    Java使用wait() notify()方法操作共享資源詳解

    這篇文章主要為大家詳細(xì)介紹了Java使用wait() notify()方法操作共享資源,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論