簡體   English   中英

使用sessionId或用戶名+密碼進行Shiro身份驗證

[英]Shiro authentication with sessionId or username+password

我在Java身份驗證框架和身份驗證工作流程方面沒有太多經驗(只有一些理論知識),所以出於教育目的,我正在嘗試為我的HTTP應用程序創建這種類型的身份驗證:

  1. 客戶端將登錄名+密碼發布到/login
  2. Shiro通過給定的憑據登錄用戶。 服務器返回客戶端他的sessionId
  3. 客戶端請求某種資源/myresource?sessionId=1234567
  4. Shiro通過給定的sessionId登錄主題。 然后,服務器執行獲取/myresource的常規工作流程(使用Shiro管理方法級訪問權限)。

基本上我有這些問題:

  1. 我想我不需要HTTP會話也不需要Servlet會話。 Shiro擁有自己的會話管理器,足以滿足我的需求。 我錯了嗎?
  2. 給客戶端提供真正的sessionId或者我應該發送某種sessionToken(在服務器端解析為sessionId)是一種好的做法嗎?
  3. 如何使用sessionId(客戶端應在本地存儲)登錄主題?
  4. 在進行這種身份驗證之前還有其他我需要知道的事情嗎?

提前致謝。

我想我不需要HTTP會話也不需要Servlet會話。 Shiro擁有自己的會話管理器,足以滿足我的需求。 我錯了嗎?

不,你說得對。 這就是Shiro很棒的原因。 來自文檔

與這兩種[Web容器或EJB有狀態會話Bean]機制中的任何一種相比,Shiro的Session支持更易於使用和管理,並且無論容器如何,它都可以在任何應用程序中使用。

例如

Subject currentUser = SecurityUtils.getSubject();    
Session session = currentUser.getSession();
session.setAttribute( "someKey", someValue);

引用docgetSession calls work in any application, even non-web applications

給客戶端提供真正的sessionId或者我應該發送某種sessionToken(在服務器端解析為sessionId)是一種好的做法嗎?

發送簡單的sessionId是個壞主意。 特別是,如果您通過未加密的網絡發送數據。 使用類似HTTPS的東西 或使用 NONCE

並且,附注,如果超過http / s POST數據而不是在URL中。

如何使用sessionId(客戶端應在本地存儲)登錄主題?

您的意思是,如果您有會話ID,您如何驗證主題? 你可以簡單地從文檔中

Subject requestSubject = new Subject.Builder().sessionId(sessionId).buildSubject();

在進行這種身份驗證之前還有其他我需要知道的事情嗎?

是。

  1. 閱讀Shiro的會話管理
  2. 關於MITM攻擊的精益
  3. 關於HTTPSSSL
  4. 一些對Hash函數阿帕奇百科全書DigestUtils ,可以是這個

更新

關於該主題認證部分 - 它是否會使新創建的主題成為當前認證的主題? 如果沒有,我如何使其成為“當前”主題?

如果你在談論new Subject.Builder().sessionId(sessionId).buildSubject() ,它就不會。 我不知道如何將它設置為線程的currentUser Shiro的JavaDoc說,

[這種方式]返回主題實例不會自動綁定到應用程序(線程)以供進一步使用。 也就是說,SecurityUtils.getSubject()不會自動返回與構建器返回的實例相同的實例。 如果需要,框架開發人員可以綁定構建的Subject以繼續使用。

所以,你可以在當前線程中如何綁定主題或進一步使用它。

如果你擔心SecurityUtils.getSubject(); thingy工作,好吧,在Web容器上下文中,它使用簡單的cookie來存儲會話數據。 當您的請求通過Shiro過濾器時,它會附加當前主題以請求其生命周期(當前線程)。 當你作為getSubject()它只是從請求獲取Subject 我在這里發現了一個有趣的線索

關於nonce部分:如果他給我發送某種哈希而不是他的sessionId - 我將無法解碼它以獲得真正的sessionId(用它來授權他)。 我在這里錯過了什么嗎?

Nonce部分 - 這是頸部疼痛。 現在重新思考,我認為做NONCE只是矯枉過正。 讓我解釋一下,無論如何,

  1. 用戶首次使用其用戶名和密碼登錄。 在客戶端設置useridnonce (比如說,UUID)和HASH(sessionID+nonce) ,稱之為hash1。 說,在cookie中。 將此nonce存儲在服務器端,可以在DB或Map中作為user_id <--> nonce,session_id

  2. 在后續請求中,請確保您傳回useridnonceHASH

  3. 在服務器端,您要做的第一件事就是驗證請求。 根據客戶端發送的user_id獲取存儲在hashmap或DB中的sessionIdnonce 創建哈希,HASH(sessionId_from_db + nonce_from_db),將其稱為hash2。

  4. 現在,如果hash1與hash2匹配,則可以驗證請求,並且由於您已在服務器端存儲了當前的sessionId,因此可以使用它。 請求完成后,在cookie和服務器端設置新的nonce。

如果你經歷1 - 4,你會發現你不需要Shiro進行身份驗證。 (:所以,我接受了我的回復,在這種情況下不應用NONCE,除非你對性能的安全性太過怪異。

為什么MITM攻擊對我很重要? 我的客戶端(javascript ajax代碼)通過ajax從它的服務器獲取數據。 所以我認為我不應該以任何方式關心MITM。

我認為這對你很重要。 MITM攻擊意味着您的請求/響應正通過計算機(MITM)鏈接到您的路由器。 如果這是一個未加密的請求,那么它就是MITM的全部明文。 他可以看到你的所有請求......並且可能欺騙請求並可能劫持會話。 讓我找一些例子.... http://michael-coates.blogspot.com/2010/03/man-in-middle-attack-explained.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM