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

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

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

背景

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

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

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

方案

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

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

思路圖

核心代碼

  • 配置過(guò)濾器

  • 過(guò)濾器實(shí)現(xiàn)

RepeatLoginFilter.java

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

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

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

/**
 * 重復(fù)登錄核心校驗(yàn)
 * @param token 當(dāng)前token
 * @return true通過(guò)放行 
 */
private boolean isAccessAllowed(String token) {
    Authentication authentication = this.tokenProvider.getAuthentication(token);
    String redisToken = redisTemplate.opsForValue().get(Constants.PREFIX_LOGIN_USER+authentication.getName());
    //redisToken為空 說(shuō)明第一次登陸 放過(guò)并加入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一致  說(shuō)明是當(dāng)前登陸用戶訪問(wèn)  放過(guò)
    if(token.equals(redisToken)){
        return true;
    }
    //redis token和當(dāng)前token不一致,比較兩個(gè)token的創(chuàng)建時(shí)間,如果當(dāng)前token大于redistoken 就說(shuō)當(dāng)前是最新的,放入redis并放過(guò)
    //否則就說(shuō)明redis里已有最新的token,當(dāng)前token應(yīng)該過(guò)期,不放行
    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;
}

/**
 * 返回退出信息到前臺(tái)
 * @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","賬號(hào)已在別的地方登錄,請(qǐng)重新登錄");
        response.getWriter().print(resultObj.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

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

相關(guān)文章

  • spring Boot 應(yīng)用通過(guò)Docker 來(lái)實(shí)現(xiàn)構(gòu)建、運(yùn)行、發(fā)布流程

    spring Boot 應(yīng)用通過(guò)Docker 來(lái)實(shí)現(xiàn)構(gòu)建、運(yùn)行、發(fā)布流程

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

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

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

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

    這篇文章主要介紹了Java代理模式(Proxy)實(shí)現(xiàn)的相關(guān)資料,代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過(guò)引入代理對(duì)象來(lái)控制對(duì)目標(biāo)對(duì)象的訪問(wèn),代理模式的優(yōu)點(diǎn)包括職責(zé)清晰、擴(kuò)展性好、保護(hù)目標(biāo)對(duì)象和增強(qiáng)功能,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Java單利模式與多線程總結(jié)歸納

    Java單利模式與多線程總結(jié)歸納

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

    UrlRewrite 重寫(xiě)url詳解及實(shí)例

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

    Java InputStream的多種使用詳解

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

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

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

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

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

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

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

    Springboot actuator應(yīng)用后臺(tái)監(jiān)控實(shí)現(xiàn)

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

最新評(píng)論

琼结县| 荣昌县| 柳河县| 崇左市| 黄骅市| 昌平区| 甘南县| 弋阳县| 黄冈市| 弋阳县| 永济市| 嵩明县| 吴川市| 郁南县| 淮南市| 和平区| 阳城县| 利辛县| 阜新市| 平昌县| 乐平市| 万安县| 饶平县| 千阳县| 眉山市| 淳化县| 宜城市| 奇台县| 孝感市| 大丰市| 闽侯县| 镇宁| 平凉市| 盱眙县| 文成县| 乌兰浩特市| 鹤山市| 隆昌县| 乐安县| 民勤县| 桦川县|