91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Security中用JWT退出登錄時遇到的坑有哪些

發布時間:2021-10-15 17:33:30 來源:億速云 閱讀:292 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“Spring Security中用JWT退出登錄時遇到的坑有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Spring Security中用JWT退出登錄時遇到的坑有哪些”這篇文章吧。

Session會話

之所以要說Session會話,是因為Spring Security默認配置就是有會話的,所以當你登錄以后Session就會由服務端保持直到你退出登錄。只要Session保持住,你的請求只要進入服務器就可以從 ServletRequest 中獲取到當前的 HttpSession ,然后會根據 HttpSession 來加載當前的 SecurityContext 。相關的邏輯在Spring Security默認的過濾器 SecurityContextPersistenceFilter 中,有興趣可以看相關的源碼。

而且默認情況下 SecurityContextPersistenceFilter 的優先級是高于退出過濾器 LogoutFilter 的,所以能夠保證有Session會話的情況下退出一定能夠獲取當前用戶。

無Session會話

使用了JWT后,每次請求都要攜帶 Bearer Token 并且被專門的過濾器攔截解析之后才能將用戶認證信息保存到 SecurityContext 中去。參考Spring Security實戰干貨教程中的Token認證實現 JwtAuthenticationFilter ,相關邏輯為:

// 當token匹配         
if (jwtToken.equals(accessToken)) {
    // 解析 權限集合  這里
    JSONArray jsonArray = jsonObject.getJSONArray("roles");
    List<String> roles = jsonArray.toList(String.class);
    String[] roleArr = roles.toArray(new String[0]);

    List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(roleArr);
    User user = new User(username, "[PROTECTED]", authorities);
    // 構建用戶認證token
    UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(user, null, authorities);
    usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
    // 放入安全上下文中
    SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
} else {
    // token 不匹配
    if (log.isDebugEnabled()){
        log.debug("token : {}  is  not in matched", jwtToken);
    }
    throw new BadCredentialsException("token is not matched");
}

為什么退出登錄無法獲取當前用戶

分析了兩種情況下用戶認證信息的安全上下文配置后,我們回到問題的本身。來看看為什么用JWT會出現無法獲取當前認證信息的原因。在 HttpSecurity 中,那位同學是這樣配置 JwtAuthenticationFilter 的順序的:

httpSecurity.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
我們再看看 Spring Security 過濾器排序圖:

Spring Security中用JWT退出登錄時遇到的坑有哪些

也就說LogoutFilter執行退出的時候,JWT還沒有被 JwtAuthenticationFilter 攔截,當然無法獲取當前認證上下文 SecurityContext 。

解決方法

解決方法就是必須在 LogoutFilter 執行前去解析JWT并將成功認證的信息存到 SecurityContext 。我們可以這樣配置:

httpSecurity.addFilterBefore(jwtAuthenticationFilter, LogoutFilter.class)
這樣問題就解決了,你只要實現把當前JWT作廢掉就退出登錄了。

以上是“Spring Security中用JWT退出登錄時遇到的坑有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平定县| 民县| 益阳市| 育儿| 和龙市| 建阳市| 南平市| 蒙阴县| 巴中市| 兴文县| 苗栗县| 屏东县| 巍山| 庆安县| 宜昌市| 邵阳市| 保定市| 凤山市| 临沧市| 周口市| 礼泉县| 天峨县| 贵港市| 依兰县| 沾化县| 平顶山市| 柳河县| 苍溪县| 宣化县| 朝阳县| 来宾市| 紫金县| 靖安县| 若羌县| 禹州市| 东宁县| 息烽县| 海宁市| 射洪县| 赤峰市| 兴仁县|