2016-10-10 58 views
1

我在我的JSF應用程序中設置了基於表單的認證。我已經使用JDBC領域進行了運行,並已將/ admin/*區域鎖定到「admin」組中的那些區域。一切似乎都按預期工作,我可以登錄並瀏覽管理部分,並且我的會話始終處於活動狀態。但是,只要我導航到管理部分之外的頁面,應用程序就會將用戶記錄下來並使會話無效。用戶會話中的任何內容都會丟失。我需要應用程序來保持用戶登錄,直到他們手動註銷或會話過期。我能做些什麼來解決這個問題?如果有問題,我正在使用Glassfish。謝謝!Java EE表單認證在離開認證區域後使會話無效

重申我的困境......在我的應用程序中,我的會話範圍bean在頁面之間導航時保​​持活動狀態,然後使用java的表單身份驗證登錄到安全管理區域,並且會話仍保持活動狀態;然後我在管理部分和會話中的頁面之間瀏覽,再次保持活動狀態;然後我離開管理區域,然後會話失效並結束,用戶註銷。我的想法是必須成爲Web容器安全機制的問題,因爲我沒有告訴它註銷或使會話無效。所以具體而言,我需要回答的第一個問題是:這是Java基於表單的身份驗證的正常行爲,在離開「不安全」區域(即未指定爲需要身份驗證的URL)時註銷並使會話無效?

我的web.xml文件包括以下行:

<security-constraint> 
    <display-name>Admin Section</display-name> 
    <web-resource-collection> 
     <web-resource-name>Admin Section</web-resource-name> 
     <description/> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>admin</role-name> 
    </auth-constraint> 
    <user-data-constraint> 
     <description/> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 
<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>sqlRealm</realm-name> 
    <form-login-config> 
     <form-login-page>/login.xhtml</form-login-page> 
     <form-error-page>/login.xhtml?error=true</form-error-page> 
    </form-login-config> 
</login-config> 
<security-role> 
    <description/> 
    <role-name>admin</role-name> 
</security-role> 
<session-config> 
    <session-timeout> 
     30 
    </session-timeout> 
</session-config> 
+1

您聲明:_「**應用程序**正在將用戶註銷並使會話失效。」_這是您的代碼,因此您應該修復此問題 – Kukeltje

+2

此問題相當廣泛。您可以輕鬆調查並排除自己。首先,您對HTTP會話和Cookie如何在封面下工作有一個最基本的瞭解嗎?例如,您確實知道HTTP cookie與特定的scheme/host/port/path綁定,並且不會在另一個上提供?所以例如當您從HTTPS導航到HTTP時,HTTPS期間創建的Cookie在HTTP中不可用?這不是特別針對JSF/JavaEE,而是針對基本的HTTP。 – BalusC

+0

@Kukeltje我沒有寫java的認證模塊,所以它不是我的代碼。我問什麼我的代碼*應該*是解決它。感謝您的幫助,寶貴的意見! – Matt

回答

0

這不是超級容易做到,但要找到你可以附上GF源在一個調試器,然後將斷點在GF代碼的元兇會話無效。

要找到這一點,請首先手動呼叫會話無效,然後遍歷代碼,直到您處於足夠低的級別。在那裏放置一箇中斷點,然後不要再手動調用會話無效,並採取措施重現最初的問題。如果會話確實被代碼無效,您的斷點將會被觸發,並且您可以在堆棧中回顧哪些代碼調用它。

至於你的具體問題:

這是Java的基於表單的認證的正常行爲,註銷和無效的會話留下一個「不安全」區域時,即不指定爲需要身份驗證的網址?

不,這絕對不是正常的行爲。

+0

我放棄了(再次)。我只寫了自己的認證類,並使用過濾器來指定需要認證的URL。直接工作。只有我更改的是從web.xml中刪除了安全配置,並且使用request.login更改了我的userSessionBean以手動驗證用戶憑據。如果你說它絕對不是正常的行爲,我會稍後再給它一個補丁並報告。乾杯! – Matt