2012-07-08 52 views
0

真的很大的問題。家庭作業再次。我幾乎沒有放棄試圖讓它工作,沒有足夠的時間了。我已經嘗試閱讀docs.oracle上所有關於安全性的內容,NetBeans上的所有安全性,類提供的所有內容(教科書不包含任何內容,所以不能將其歸咎於過時的書籍)和通過谷歌和許多問題在這裏一堆教程。我無法讓它工作。jsf2/glassfish3安全

我不是在尋找一個答案的功課,更是什麼,我需要看事物要仔細檢查,我可能俯瞰....

應用程序應該允許兩個用戶不同的羣體登錄。管理員用戶可以訪問所有內容,而用戶用戶只能訪問/ user/*。我們不限於嚴格的程序安全性,我們也不限於特定的聲明式安全。我們必須創建一個servlet來控制頁面流(就像我向教師提到的那樣,JSF帶有一個控制器,並且可以通過框架控制頁面流,但這已經不會影響他的決定)。如果有人當前沒有登錄在嘗試訪問其中一個受保護區域時,應根據我們的安全實施情況提示他們登錄/重定向到登錄頁面/無論登錄需要發生什麼。如果登錄的用戶用戶嘗試訪問管理員區域,他們應該提示他們不是管理員,沒有關於他們是否應該返回到他們所在的位置,註銷或提示以管理員身份登錄的詳細信息。唯一的要求是我們不能使用數據庫來存儲用戶名和密碼。

所以我在文件領域設置了兩個用戶,一個是User,一個是Admin。我嘗試將其設置爲基本身份驗證,當用戶運行該頁面時,它不提示登錄。我嘗試創建一個自定義登錄/登錄錯誤頁面和表單身份驗證,當用戶運行該頁面時,它不會顯示我的登錄表單。到目前爲止,我所能做的唯一事情就是將Login頁面作爲歡迎文件,並在表單提交時調用Servlet,並使用request.login(username,password)並在用戶登錄時記錄用戶領域和一切匹配。然後,我可以檢查角色並將事情設置在用戶的bean中,並根據指定的角色將它們轉發到適當的起始頁面。但是,如果我運行它並導航到另一個頁面,而無需在表單中輸入數據並將其提交到登錄頁面,則會顯示頁面。如果我以用戶角色登錄並導航到其中一個管理區域頁面,它可以讓我。我爲url設置了安全約束,我使用了我在這裏看到的用於不同URL的示例中的過濾器,並且它們不會被調用。

有可能是我錯過了一些簡單的東西,並且進入這個類不知道html和java以外的東西可能是最大的問題,並且我真的不知道我在這個類中如何處於邊界A. ..
除此之外還有更多的項目,但其餘不是我看到自己有問題,但我一直掛在這一週的安全部分大部分時間,並沒有甚至開始它。

的web.xml

<context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet> 
     <servlet-name>Controller</servlet-name> 
     <servlet-class>Project2.Controller</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Controller</servlet-name> 
     <url-pattern>/Controller</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
    <security-constraint> 
     <display-name>AdminConstraint</display-name> 
     <web-resource-collection> 
      <web-resource-name>admin</web-resource-name> 
      <description/> 
      <url-pattern>/admin/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>Admin</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <security-constraint> 
     <display-name>UserConstraint</display-name> 
     <web-resource-collection> 
      <web-resource-name>user</web-resource-name> 
      <description/> 
      <url-pattern>/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>User</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <security-role> 
     <description/> 
     <role-name>User</role-name> 
    </security-role> 
    <security-role> 
     <description/> 
     <role-name>Admin</role-name> 
    </security-role> 
    </web-app> 

login.xhtml

<f:view> 
     <html> 
      <head> 
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
       <title>JSP Page</title> 
      </head> 
      <body> 
       <h1><h:outputText value="Welcome! Choose an action below."/></h1> 

       <form method="Post" action="Controller"> 
        <h:inputText id="userName" value=""/> 
        <h:inputSecret id="password" value=""/> 
        <h:commandButton value="Login" type="submit"/> 
       </form> 
      </body> 
     </html> 
    </f:view> 
+0

到目前爲止,你做了什麼,看起來不錯。但在這裏看起來有點不對勁「但是如果我運行它並導航到另一個頁面而不輸入數據到表單並提交它登錄,頁面將顯示」。你能發佈你的web.xml和登錄頁面的代碼嗎? – Ravi 2012-07-08 08:27:21

+0

@Ravi所以,在這裏粘貼代碼並對其進行格式化時,我注意到一些以前沒有顯示的東西或者我認爲已經刪除的東西。它被設置爲加載index.html作爲歡迎文件,我認爲我設置了Login.jsp,登錄設置爲FORM。所以它畢竟顯示了登錄頁面。在刪除FORM的標籤作爲登錄類型時,運行它會顯示彈出式登錄框,出於某種原因,我無法將它顯示在前面。儘管如此,它仍然可以讓我避開兩個網址的限制。也許與我的Glassfish服務器有關? – 2012-07-08 09:27:10

+0

真的開始懷疑我是否有時在錯誤的web.xml中進行更改。但是Glassfish也很奇怪。它不斷清空用戶的領域或使團隊加倍。 – 2012-07-08 09:31:08

回答

0

因此,基於你有你的目標似乎實現基於容器的身份驗證和授權。因此,除了你所擁有的,你還需要登錄配置添加到您的部署描述符這樣的:

<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>yourRealmName</realm-name> 
    <form-login-config> 
     <form-login-page>/login.xhtml</form-login-page> 
     <form-error-page>/error.xhtml</form-error-page> 
    </form-login-config> 
</login-config> 

上述配置指定的登錄頁面,在用戶名和密碼,錯誤頁面的用戶類型,其如果認證失敗,它將被重定向。

而在你login.xhtml你需要指定張貼形式j_security_check是這樣的:

<form action="j_security_check" method="POST"> 
    <input type="text" name="j_username" /> 
    <input type="secret" name="j_password" /> 
    ... 
</form> 

或者基於容器的身份驗證,也可以在這裏提交的表單進行編程認證。用戶角色將被檢查並返回所需的操作結果。我認爲你不再需要這個控制器。

更多關於這方面的詳細信息請參見Java EE 6文檔here

+0

控制器是作業的一部分。我們已經多次提到我們得到的任務並不需要它。我放棄了登錄配置信息,因爲我認爲我已經刪除它,並將歡迎文件作爲Login.jsp,但似乎我在web.xml文件上進行了第一次嘗試的更改。 – 2012-07-08 10:08:19

+0

本週我讀過文檔的次數已經減少了不少。有了FORM,它是否必須使用確切的形式?我已經能夠通過我的Login.jsp獲取request.login()以在我的控制器中工作。之後,我迷路了。我有控制器將用戶名和角色設置爲稍後調用的bean,但我相信還有其他方法。這可能更多的是我不是真正瞭解html而不是其他任何東西。 – 2012-07-08 10:14:38

+0

將Login.jsp更改爲Login.xhtml,出於某種原因使用Login.jsp,它不再需要加載,xhtml只顯示一個空白頁面。 – 2012-07-08 10:36:25