簡體   English   中英

使用Spring Security進行會話管理

[英]Session management using spring security

我已經使用UserDetailsS​​ervice創建了一個基本的spring安全認證,現在我可以驗證用戶了。 但是,我不明白如何實現以下目標:

  1. 用戶登錄后,下一個請求到達時,如何以及在何處檢查該請求是否來自同一登錄用戶或其他登錄用戶?

我知道Spring攔截器的概念,在這里我可以攔截所有傳入的請求。 但是,在Spring Security中有什么可以做到的嗎?

  1. 登錄后如何啟動會話並將該用戶的值存儲在會話中?

我瀏覽了現有答案,但是大多數示例都是用於登錄的。

如果有人可以給我例子,我將不勝感激。

編輯:我認為我應該使用會話范圍的bean來維護用戶的會話內容,而不是直接操作httpsession。

首先,您需要使用當前的HttpRequest創建一個Authentication對象,如下所示:

 public class SessionService{

    public Authentication getSession(HttpServletRequest request) {
        HttpSession session=request.getSession();
        SecurityContext ctx= (SecurityContext) session.getAttribute("SPRING_SECURITY_CONTEXT");
        Authentication auth=ctx.getAuthentication();
        return auth;
    }
}

然后,可以通過傳遞當前的HttpRequest,從該Authentication對象檢索會話詳細信息,如下所示:

Authentication auth = sessionService.getSession(request);

上面的auth對象包含您需要的詳細信息。

我認為您確實需要花一些時間閱讀Spring安全文檔以及所有JSP,Servlet和MVC架構。 你有一些誤會,

  1. 身份驗證后,您無需啟動請求發出時已經存在的會話。 記住request.getSession()我們從請求中獲取會話的,我真的不知道有其他方法可以實例化會話對象並將其分配給請求/響應。 成功通過身份驗證后,spring會在會話中自動設置一個SPRING_SECURITY_CONTEXT屬性,以后該變量將用於確定用戶是否已通過身份驗證(Spring會為您執行此操作,您無需使用此屬性)。

  2. 在Spring Security中,我們設置了一個身份驗證入口點,該入口點包含有關登錄頁面URL的信息和FORM_LOGIN_FILTER,其中包含有關登錄處理URL,登錄成功URL和登錄失敗URL的信息。每個會話的請求都沒有SPRING_SECURITY_CONTEXT和auth屬性重定向到登錄頁面URL。

我可以直接給出代碼,但是如果您至少在這里閱讀Spring文檔的幾頁,那將是很棒的。 一旦理解了這些概念,仍然無法解決問題。 編輯包含詳細問題的問題,我們將嘗試解決。

暫無
暫無

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

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