jaas_受JAAS保护的JAX-RS端点
jaas
隨著RESTFUL(JAX-RS)作為創建Web服務端點的“首選”方式的問世,很長一段時間以來,我一直想知道人們如何圍繞它實現安全機制。
歸根結底,我假設JAX-RS的基礎實現是servlet,因此其安全性也可能圍繞容器(即JAAS)已經提供的安全性。
這篇文章將涵蓋我在Glassfish 3上如何使用JDBC領域,JAX-RS逐步實現基于FORM的安全性以及如何使用cURL對其進行測試的發現。
設置JDBC領域
首先,因為我們使用的是JDBC領域,所以我們假設我們已經在JNDI jdbc/test下創建了到基礎數據庫的JDBC連接。
下一步是創建一個新領域。 您可以通過以下方法執行此操作:轉到服務器配置>安全性>領域,然后添加一個新領域。 選擇領域類型com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm ,然后填充必填字段。
- 首先給您的新領域起一個名字。
- 對于JAAS Context,將jdbcRealm
- 填充JNDI名稱,最好以"jndi/"開頭
接下來,請注意其余字段。 Glassfish似乎希望看到兩個表。 第一個表包含用戶列表,其中用戶名是其唯一標識符。 第二張表列出了每個用戶所屬的組。 用戶名是兩個表之間的外鍵鏈接。 (下一節應該讓您更好地了解表格的外觀,畢竟它們非常簡單)。
一旦創建了這些表,我們就可以相應地填充必填字段。
填充數據庫以進行測試
下一步是填充表以進行測試。 假設我們將使用用戶名hpotter和password test 。 但是,對于密碼,請注意,Glassfish的摘要默認情況下為SHA-256,如以下屏幕截圖所示。
因此,您需要在插入之前對密碼test進行編碼。 您可以使用technipixel編碼器,這將為您提供字符串9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 。
下一步是編寫一些INSERT語句:
INSERT INTO person (id, password, username) VALUES (1, '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', 'hpotter'); COMMIT; INSERT INTO person_role (username, user_group) VALUES ('hpotter', 'User'); INSERT INTO person_role (username, user_group) VALUES ('hpotter', 'Admin'); COMMIT;讓我們繼續下一步。
使用JAAS保護Web應用程序的安全
關于JAAS的很多使用FORM認證方法的教程。 但是,我想我再把它放在這里,希望有人會發現它更簡單。
web.xml
對您的web.xml進行以下修改
<welcome-file-list><welcome-file>/index.jsp</welcome-file><!-- 1 --></welcome-file-list><security-constraint><!-- 2 --><display-name>TestConstraint</display-name><web-resource-collection><web-resource-name>TestResource</web-resource-name><description/><url-pattern>/*</url-pattern></web-resource-collection><auth-constraint><description/><role-name>User</role-name><role-name>Admin</role-name></auth-constraint></security-constraint><login-config><!-- 3 --><auth-method>FORM</auth-method><realm-name>testRealm</realm-name><form-login-config><form-login-page>/login.html</form-login-page><form-error-page>/error.html</form-error-page></form-login-config></login-config><security-role><!-- 4 --><description/><role-name>User</role-name></security-role><security-role><!-- 5 --><description/><role-name>Admin</role-name></security-role>讓我們一一講解它們。
glassfish-web.xml
我們還需要配置glassfish-web.xml以便容器知道數據庫中組之間的映射以及應用程序識別的角色。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app error-url=""><security-role-mapping><role-name>Admin</role-name><group-name>Admin</group-name></security-role-mapping><security-role-mapping><role-name>User</role-name><group-name>User</group-name></security-role-mapping><class-loader delegate="true"/><jsp-config><property name="keepgenerated" value="true"><description>Keep a copy of the generated servlet class' java code.</description></property></jsp-config> </glassfish-web-app>注意:如果您使用Netbeans,則可能會為您生成此文件。
登錄頁面:login.html
如果我們再次參考上面的web.xml ,請注意登錄頁面指向login.html 。 對于FORM身份驗證方法,根據規范,我們需要使用j_security_check , j_username和j_password (Oracle 2013)。
<!DOCTYPE html> <html><body><form action="j_security_check" method="post"><p><strong>Username</strong><input type="text" name="j_username" size="25" /></p><p><strong>Password</strong><input type="password" size="15" name="j_password" /></p><p><input type="submit" value="Submit" /><input type="reset" value="Reset" /></p></form></body> </html>完成所有這些操作后,我們可以啟動Glassfish,部署我們的應用程序并使用任何瀏覽器對其進行測試。 訪問該應用程序后,應將用戶定向到login.html進行登錄。 請記住使用hpotter作為用戶名并test作為密碼。 成功登錄后,應將用戶重定向到index.jsp (根據您的要求,該重定向又將用戶重定向到index.jsf或index.jsp重定向到的任何內容)。
創建一個RESTFUL端點
當然,下一步是創建一個RESTFUL端點,這非常簡單。 我在這里寫的一篇文章可能也很有用。
首先,假設我們具有以下應用程序路徑。
package com.dwuysan;import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application;/*** @author denywuy*/ @ApplicationPath(value = "resources") public class ApplicationConfig extends Application { }讓我們假設我們具有以下簡單的RESTFUL服務。
package com.dwuysan;import com.dwuysan.entity.Outlet; import com.dwuysan.service.OutletService; import javax.annotation.ManagedBean; import javax.annotation.security.RolesAllowed; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam;@Path(value = "generic") @RolesAllowed(value = "User") @ManagedBean public class GenericResource {@Injectprivate OutletService outletService;@GET@Path("{id}")public Outlet get(@PathParam(value = "id") final long id) {return this.outletService.getOutlet(id);} }請注意,我們已使用javax.annotation.security.RolesAllowed批注保護了此服務的安全。
使用curl測試安全的RESTFUL服務
鑒于我們上面創建的RESTFUL服務,我們應該能夠使用CURL通過以下命令對其進行測試:
curl -X GET -H "Accept:application/json" -H "Content-Type:application/json" http://localhost:8080/testApp/resources/generic/101上面的命令翻譯為以下內容:使用GET命中上面的URL,標題為Accept:application / json和Content-Type:application / json(cURL 2013)
由于我們已經保護了我們的應用程序,因此上述調用將無法進行。 用戶將被重定向到login.html 。 因此,我們現在的目標是首先登錄。 使用cURL,我們可以提交登錄參數(即用戶名和密碼),然后獲取cookie。 為此,我們可以使用以下命令:
curl -b cookies.txt -c cookies.txt -d "j_username=hpotter&j_password=test" http://localhost:8080/testApp/j_security_check該命令將用戶名和密碼提交給j_security_check (記住我們之前創建的login.html ),并將獲得的cookie存儲在cookies.txt文件cookies.txt 。
如果打開cookies.txt,則可能會看到以下內容:
# Netscape HTTP Cookie File # http://curl.haxx.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk.#HttpOnly_localhost FALSE /testApp FALSE 0 JSESSIONID 245a317ab91fbb28244403346770注意:您可能會收到“文件移動”響應。 這意味著登錄已成功。 否則,您將再次獲得error.html的原始html。
成功通過身份驗證后,我們可以使用從登錄名獲得的cookie來調用RESTFUL服務。
curl -X GET -H "Accept:application/json" -H "Content-Type:application/json" -b cookies.txt -c cookies.txt http://localhost:8080/testApp/resources/generic/101參考文獻:
- BalusC,2012年, ``是否基于JSF支持表單的安全性'' ,2013年2月12日訪問。
- Oracle,2013年, “保護Web應用程序的安全” ,2013年2月12日訪問。
- Wolff,N,2005年, “如何使用帶有CURL的cookie處理身份驗證?” ,2013年2月12日訪問。
翻譯自: https://www.javacodegeeks.com/2013/09/jaas-secured-jax-rs-end-point.html
jaas
總結
以上是生活随笔為你收集整理的jaas_受JAAS保护的JAX-RS端点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2825628257是什么歌 28256
- 下一篇: 手机桌面怎么恢复原状 手机桌面恢复原状操