最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

背景

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

  • 用戶重復登錄
  • 接口未授權
  • 接口越權訪問

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

方案

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

  • 用戶登錄成功 生成token給到用戶, 同時存儲到redis中(key值為用戶名(標識)) value為生成的token
  • 用戶再次訪問系統(tǒng)請求參數(shù)中帶有token信息 后臺通過過濾器進行攔截進行比對
  • 如果token匹配成功 就放行 匹配不成功 說明兩個token不一致 開始比對對應的時間戳 后者時間戳 大于前者就把當前token覆蓋(如果舊的token請求再次進來 期時間戳就晚于當前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);
    //重復登錄只校驗帶有合法jwt的  放過驗證碼以及免鑒權的那些請求
    if (null == jwt || "null".equalsIgnoreCase(jwt) || !this.tokenProvider.validateToken(jwt)) {
        filterChain.doFilter(request, response);
        return;
    }

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

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

/**
 * 重復登錄核心校驗
 * @param token 當前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和當前token一致  說明是當前登陸用戶訪問  放過
    if(token.equals(redisToken)){
        return true;
    }
    //redis token和當前token不一致,比較兩個token的創(chuàng)建時間,如果當前token大于redistoken 就說當前是最新的,放入redis并放過
    //否則就說明redis里已有最新的token,當前token應該過期,不放行
    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();
    }
}

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

相關文章

  • spring Boot 應用通過Docker 來實現(xiàn)構建、運行、發(fā)布流程

    spring Boot 應用通過Docker 來實現(xiàn)構建、運行、發(fā)布流程

    這篇文章主要介紹了spring Boot 應用通過Docker 來實現(xiàn)構建、運行、發(fā)布流程,圖文詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • Java開發(fā)實現(xiàn)猜拳游戲

    Java開發(fā)實現(xiàn)猜拳游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Java代理模式(Proxy)實現(xiàn)方法詳解

    Java代理模式(Proxy)實現(xiàn)方法詳解

    這篇文章主要介紹了Java代理模式(Proxy)實現(xiàn)的相關資料,代理模式是一種結構型設計模式,通過引入代理對象來控制對目標對象的訪問,代理模式的優(yōu)點包括職責清晰、擴展性好、保護目標對象和增強功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • Java單利模式與多線程總結歸納

    Java單利模式與多線程總結歸納

    這篇文章主要介紹了Java單利模式與多線程總結歸納 的相關資料,需要的朋友可以參考下
    2016-03-03
  • UrlRewrite 重寫url詳解及實例

    UrlRewrite 重寫url詳解及實例

    這篇文章主要介紹了UrlRewrite 重寫url詳解及實例的相關資料,重寫能美化,提高安全,有利于搜索引擎的收入等,需要的朋友可以參考下
    2016-12-12
  • Java InputStream的多種使用詳解

    Java InputStream的多種使用詳解

    這篇文章主要介紹了Java InputStream的多種使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 在IDEA中配置Maven鏡像的最新方法

    在IDEA中配置Maven鏡像的最新方法

    這篇文章主要給大家介紹了關于在IDEA中配置Maven鏡像的最新方法,Maven是一個流行的Java項目構建工具,它依賴于互聯(lián)網(wǎng)上的Mave中央倉庫來下載和管理項目依賴庫,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • SpringMVC+MyBatis實現(xiàn)多數(shù)據(jù)源切換

    SpringMVC+MyBatis實現(xiàn)多數(shù)據(jù)源切換

    在企業(yè)級應用開發(fā)中,經(jīng)常需要處理來自不同數(shù)據(jù)庫的數(shù)據(jù),為了滿足這一需求,我們可以通過配置多個數(shù)據(jù)源來實現(xiàn)對不同數(shù)據(jù)庫的訪問,下面我們來看看具體實現(xiàn)吧
    2025-01-01
  • java圖片和文本同時提交到表單的實例代碼

    java圖片和文本同時提交到表單的實例代碼

    在本篇文章里小編給大家整理的是關于java實現(xiàn)圖片和文本同時提交到表單的相關內(nèi)容,有需要的朋友們可以學習下。
    2020-02-02
  • Springboot actuator應用后臺監(jiān)控實現(xiàn)

    Springboot actuator應用后臺監(jiān)控實現(xiàn)

    這篇文章主要介紹了Springboot actuator應用后臺監(jiān)控實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04

最新評論

应城市| 甘谷县| 富平县| 长治市| 瑞昌市| 汝州市| 桦甸市| 泽普县| 外汇| 出国| 扎赉特旗| 会泽县| 田东县| 行唐县| 德格县| 如皋市| 丹凤县| 朝阳区| 鄂伦春自治旗| 绵阳市| 剑河县| 大化| 辽源市| 五大连池市| 鄂伦春自治旗| 东阿县| 慈利县| 柘城县| 广水市| 连云港市| 开封县| 东明县| 临武县| 若羌县| 商水县| 石景山区| 汽车| 松潘县| 定陶县| 米林县| 宜章县|