2012-11-28 50 views
2

在使用容器管理的安全性的JSF2/Java EE 6 Web應用程序中,基於表單的身份驗證(j_security_check)需要請求受保護的頁面,然後容器處理登錄爲您處理,一旦通過身份驗證,瀏覽器就會重定向到請求的頁面。JSF/Java EE登錄不需要受保護的資源

有很多常見的情況下,這不是你希望你的應用程序的行爲。例如,您可能希望擁有隻讀版本和同一頁面的可更新版本。如果用戶未登錄,那麼您可以在該頁面上放置一個「現在登錄即可編輯」按鈕,並且如果用戶登錄,則可以編輯這些字段。但是,在兩種情況下,它都是相同的JSF頁面,並且該視圖不能既不受保護也不受保護,所以j_security_check似乎無法處理這種情況。

於是,兩個問題:

1)可j_security_check被操縱成實現這一功能呢?或者 2)什麼是「正常」方式?如果j_security_check不能執行,那麼JSF/JavaEE webapps會實現這個功能?

回答

1

登錄的用戶也可在不安全的頁面中使用。您可以通過檢查HttpServletRequest#getRemoteUser()的存在和HttpServletRequest#isUserInRole()的角色檢查並相應地呈現受限制的組件來執行登錄檢查。

例如,顯示「登錄編輯」按鈕,在未登錄用戶:

<h:commandButton 
    value="Login to edit" action="#{auth.login}" 
    rendered="#{empty request.remoteUser}" /> 

,並顯示「編輯」按鈕,只有當用戶登錄,或者具有所期望的作用:

<h:commandButton 
    value="Edit" action="#{someBean.edit(someItem)}" 
    rendered="#{not empty request.remoteUser}" /> 
<!-- or --> 
<h:commandButton 
    value="Edit" action="#{someBean.edit(someItem)}" 
    rendered="#{request.isUserInRole('ADMIN')}" /> 
+0

感謝BalusC。 #{auth.login}發生了什麼?該方法是否可以觸發j_security_check並重新呈現相同的頁面?可選的渲染不是問題(但是,儘管如此,謝謝),但是如何使用j_security_check在#{auth.login}中強制登錄並在登錄後返回到同一頁面。如果使用j_security_check無法完成此操作,那麼執行此操作的首選方法是什麼?再次感謝你。 – user815806

+0

請參閱此答案的「程序化登錄」部分:http://stackoverflow.com/questions/2206911/best-way-for-user-authentication-on-javaee-6-using-jsf-2-0/2207147# 2207147它歸結爲用所提供的憑據手動調用'HttpServletRequest#login()'。 – BalusC

+0

我會檢查一下。謝謝。非常有幫助。 – user815806

相關問題