使用GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证
我的博客上最受歡迎的帖子之一是有關JDBC安全領域和帶有Primefaces的GlassFish上基于表單的身份驗證的簡短教程。 在收到有關它不再適用于最新的GlassFish 3.1.2.2的評論后,我認為可能是時候重新訪問它并提出更新的版本了。 開始了:
制備
就像在原始教程中一樣,我將依靠某些東西。 確保安裝了最新的NetBeans 7.3 beta2(包括GlassFish 3.1.2.2)和MySQL Community Server(5.5.x)。 您應該已經驗證一切正常,并且可以啟動GlassFish并且MySQL Server也已啟動。
一些基礎
GlassFish身份驗證領域,也稱為安全策略域或安全域,是GlassFish Server在其上定義和實施通用安全策略的范圍。 GlassFish Server已預先配置了文件,證書和管理領域。 此外,您可以設置LDAP,JDBC,摘要,Oracle Solaris或自定義領域。 應用程序可以在其部署描述符中指定要使用的領域。 如果要將應用程序的用戶憑據存儲在數據庫中,則首選是JDBC領域。
準備數據庫
啟動NetBeans并切換到“服務”選項卡。 右鍵單擊“數據庫”節點,然后選擇“注冊MySQL服務器”。 填寫安裝細節,然后單擊“確定”。 右鍵單擊新的MySQL節點,然后選擇“連接”。 現在,您將看到所有已經可用的數據庫。 再次右鍵單擊并選擇“創建數據庫”。 輸入“ jdbcrealm”作為新的數據庫名稱。 備注:我們不會用一個單獨的數據庫用戶來完成所有這些工作。 強烈建議您這樣做,但是我在此示例中使用的是root用戶。 如果您有用戶,還可以在此處授予對其的完全訪問權限。 點擊“確定”。 您將自動連接到新創建的數據庫。 展開粗體節點,然后右鍵單擊“表”。 選擇“執行命令”或通過向導輸入表格詳細信息。
現在,這就是數據庫的全部內容。 移至下一段。
讓GlassFish了解MySQL
首先要做的是從撰寫本文時的5.1.22的MySQL網站獲取最新最好的MySQL Connector / J。 解壓縮mysql-connector-java-5.1.22-bin.jar文件并將其放到您的域文件夾中(例如,glassfish \ domains \ domain1 \ lib)。 做完了 現在終于可以創建一個項目了。
基本項目設置
啟動一個新的基于Maven的Web應用程序項目。 選擇“新建項目”>“ Maven”>“ Web應用程序”,然后單擊下一步。 現在輸入一個名稱(例如secureapp)和所有需要的maven坐標,然后單擊下一步。 選擇您配置的GlassFish 3+服務器。 選擇Java EE 6 Web作為您的EE版本,然后點擊“完成”。 現在我們需要在GlassFish域中添加更多配置。右鍵單擊新創建的項目,然后選擇``新建>其他> GlassFish> JDBC連接池''。 輸入新連接池的名稱(例如SecurityConnectionPool),并在“從現有連接中提取:”復選框下方,選擇您注冊的MySQL連接。 點擊下一步。 查看連接池屬性,然后單擊“完成”。 現在,新創建的Server Resources文件夾顯示了sun-resources.xml文件。 遵循步驟并創建一個“新建>其他> GlassFish> JDBC資源”,指向創建的SecurityConnectionPool(例如jdbc / securityDatasource)。您將在名為glassfish-resources.xml的文件“其他源/設置”下找到已配置的內容。 。 它與應用程序一起部署到您的服務器。 因此,您不必在乎使用GlassFish管理控制臺配置所有內容。此外,我們仍然需要Primefaces。 右鍵單擊您的項目,選擇“屬性”更改為“框架”類別,然后添加“ JavaServer Faces”。 切換到“組件”選項卡,然后選擇“ PrimeFaces”。 單擊“確定”完成。 您可以通過打開pom.xml并檢查Primefaces依賴項來驗證是否可行。 3.4應該在那里。 隨時將版本更改為最新的3.4.2。
最終的GlassFish配置
現在是時候啟動GlassFish并進行領域配置了。 在NetBeans中,再次切換到“服務”選項卡,然后右鍵單擊“ GlassFish 3+”節點。 選擇“開始”,并觀察“輸出”窗口是否成功啟動。 再次右鍵單擊并選擇“查看域管理控制臺”,這將打開默認的瀏覽器,指向您http:// localhost:4848 /。 選擇“配置>服務器配置>安全性>領域”,然后單擊表頂部的“新建…”。 輸入名稱(例如JDBCRealm),然后從下拉列表中選擇com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm。 在文本字段中填寫以下值:
| 賈斯 | jdbcRealm |
| 日本國家發展研究院 | jdbc / securityDatasource |
| 用戶表 | 使用者 |
| 用戶名列 | 用戶名 |
| 密碼欄 | 密碼 |
| 組表 | 團體 |
| 組名列 | 組的名字 |
保留所有其他默認值/空白,然后在右上角選擇“確定”。 您會看到一個漂亮JavaScript警告窗口,該窗口告訴您_not_保留“摘要算法”字段為空。 我發現了一個關于它的錯誤。 默認為SHA-256。 與3.1之前使用MD5的GlassFish版本不同。 本教程的較舊版本完全不使用摘要算法(“無”)。 這是為了使事情變得容易,但根本不被認為是好的做法。 因此,即使開發,也請堅持使用SHA-256。
保護您的應用程序
完成配置環境。 現在,我們必須實際保護應用程序。 第一部分是考慮要保護的資源。 跳到您的Web頁文件夾,然后再創建兩個文件夾。 一個叫“管理員”,另一個叫“用戶”。 其背后的想法是擁有兩個單獨的文件夾,屬于相應組的用戶可以訪問這些文件夾。 現在我們必須創建一些頁面。 打開Web Pages / index.xhtml并將h:body標記之間的所有內容替換為以下內容:
<h:body>Select where you want to go:<br /><h:link outcome='admin/index' value='To the admin section' /><br /><h:link outcome='users/index' value='To the user section' /></h:body>現在,將新的index.xhtml添加到用戶和admin文件夾。 讓他們做這樣的事情:
<h:body><h1>Hello Admin|User</h1><br /><h:link outcome='/index' value='Back to Homepage' /></h:body>轉到login.xhtml。 在Web文件夾的根目錄中使用以下內容創建它。
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> <html xmlns='http://www.w3.org/1999/xhtml'xmlns:p='http://primefaces.org/ui'xmlns:h='http://java.sun.com/jsf/html'><h:head><title>Login Form</title></h:head><h:body><p:panel header='Login From'><form method='POST' action='j_security_check'>Username: <input type='text' name='j_username' />Password: <input type='password' name='j_password' /><br /><input type='submit' value='Login' /><input type='reset' value='Reset' /></form></p:panel></h:body> </html>如您所見,它具有基本的Primefaces p:panel組件,該組件具有簡單的html形式,該形式指向預定義的動作j_security_check。 這就是所有魔力發生的地方。 您還必須包括兩個用于用戶名和密碼的輸入字段,并帶有預定義的名稱j_username和j_password。 現在,如果用戶未輸入正確的憑據,我們將創建顯示的loginerror.xhtml。 (使用與上例相同的DOCTYPE和標頭)。
<h:body><p:panel header='Login Error'>Sorry, you made an Error. Please try again: <a href='#{facesContext.externalContext.requestContextPath}/' >Login</a></p:panel></h:body>唯一的魔術是登錄錨的href鏈接。 我們需要獲取正確的請求上下文,這可以通過訪問faces上下文來完成。 如果沒有適當權限的用戶嘗試訪問文件夾,則會看到“ 403訪問被拒絕”錯誤頁面。 如果要自定義它,則需要添加它,并將以下幾行添加到web.xml中:
<error-page> <error-code>403</error-code> <location>/faces/403.xhtml</location> </error-page>該片段定義了所有未經授權的請求都應轉到403頁。 如果您已經打開了web.xml,讓我們開始保護您的應用程序。 我們需要為任何受保護的資源添加安全約束。 盡管安全約束對于Java EE Web應用程序的安全至關重要,但它對Web開發人員的了解卻很少。 指定URL模式,HTTP方法,角色和傳輸約束的組合對于程序員或管理員而言可能是艱巨的。 重要的是要意識到,任何旨在安全但未通過安全約束指定的組合都將意味著Web容器將允許這些請求。 安全約束包括Web資源集合(URL模式,HTTP方法),授權約束(角色名稱)和用戶數據約束(是否需要通過受保護的傳輸(例如TLS)接收Web請求)。
<security-constraint><display-name>Admin Pages</display-name><web-resource-collection><web-resource-name>Protected Admin Area</web-resource-name><description></description><url-pattern>/faces/admin/*</url-pattern><http-method>GET</http-method><http-method>POST</http-method><http-method>HEAD</http-method><http-method>PUT</http-method><http-method>OPTIONS</http-method><http-method>TRACE</http-method><http-method>DELETE</http-method></web-resource-collection><auth-constraint><description/><role-name>admin</role-name></auth-constraint><user-data-constraint><transport-guarantee>NONE</transport-guarantee></user-data-constraint></security-constraint><security-constraint><display-name>All Access</display-name><web-resource-collection><web-resource-name>None Protected User Area</web-resource-name><description/><url-pattern>/faces/users/*</url-pattern><http-method>GET</http-method><http-method>POST</http-method><http-method>HEAD</http-method><http-method>PUT</http-method><http-method>OPTIONS</http-method><http-method>TRACE</http-method><http-method>DELETE</http-method></web-resource-collection><user-data-constraint><transport-guarantee>NONE</transport-guarantee></user-data-constraint></security-constraint>如果必須定義約束,那么容器應如何挑戰用戶。 Web容器可以使用HTTP BASIC,HTTP DIGEST,HTTPS CLIENT或基于FORM的身份驗證方案對Web客戶端/用戶進行身份驗證。 在這種情況下,我們使用基于FORM的身份驗證并定義JDBCRealm。
<login-config><auth-method>FORM</auth-method><realm-name>JDBCRealm</realm-name><form-login-config><form-login-page>/faces/login.xhtml</form-login-page><form-error-page>/faces/loginerror.xhtml</form-error-page></form-login-config></login-config>領域名稱必須是您之前分配的安全領域的名稱。 關閉web.xml并打開sun-web.xml,以進行從應用程序角色名到數據庫中實際組的映射。 這種抽象感覺很奇怪,但是有一些原因。 引入它是為了可以將應用程序角色映射到企業中的不同組名。 我從未見過廣泛使用此功能,但是該功能已存在,您必須對其進行配置。 其他應用服務器的確假設沒有映射,則角色名稱和組名稱確實匹配。 GlassFish不這么認為。 因此,您必須將以下內容放入glassfish-web.xml中。 您可以通過右鍵單擊項目的WEB-INF文件夾來創建它,選擇“新建>其他> GlassFish> GlassFish描述符”
<security-role-mapping><role-name>admin</role-name><group-name>admin</group-name></security-role-mapping>就是說,基本上……您所需的一切都準備就緒。 唯一缺少的是數據庫中的用戶。 它仍然是空的……我們需要添加一個測試用戶:
將測試用戶添加到數據庫
再次,我們首先右鍵單擊NetBeans中“服務”選項卡上的jdbcrealm數據庫。 選擇“執行命令”并插入以下內容:
INSERT INTO USERS VALUES ('admin', '8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918'); INSERT INTO USERS_GROUPS VALUES ('admin', 'admin');您可以使用用戶admin和密碼admin登錄并訪問安全區域。 生成哈希的示例代碼如下所示:
try {MessageDigest md = MessageDigest.getInstance('SHA-256');String text = 'admin';md.update(text.getBytes('UTF-8')); // Change this to 'UTF-16' if neededbyte[] digest = md.digest();BigInteger bigInt = new BigInteger(1, digest);String output = bigInt.toString(16);System.out.println(output);} catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {Logger.getLogger(PasswordTest.class.getName()).log(Level.SEVERE, null, ex);}
參考:來自JCG合作伙伴 Markus Eisele的GlassFish 3.1.2.2和Primefaces 3.4的JDBC領域和基于表單的身份驗證,來自企業軟件開發和Java博客。
翻譯自: https://www.javacodegeeks.com/2013/02/jdbc-realm-and-form-based-authentication-with-glassfish-3-1-2-2-and-primefaces-3-4.html
總結
以上是生活随笔為你收集整理的使用GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天正cad旋转快捷键(天正cad快捷键大
- 下一篇: 彩色电脑简约壁纸(彩色电脑简约壁纸图片)