受JAAS保护的JAX-RS端点
隨著RESTFUL(JAX-RS)作為創(chuàng)建Web服務(wù)端點(diǎn)的“首選”方式的問(wèn)世,很長(zhǎng)一段時(shí)間以來(lái),我一直想知道人們?nèi)绾螄@它實(shí)現(xiàn)安全機(jī)制。
歸根結(jié)底,我假設(shè)JAX-RS的基礎(chǔ)實(shí)現(xiàn)是servlet,因此其安全性也可能圍繞容器(即JAAS)已經(jīng)提供的安全性。
這篇文章將涵蓋我在Glassfish 3上如何使用JDBC領(lǐng)域,JAX-RS逐步實(shí)現(xiàn)基于FORM的安全性以及如何使用cURL對(duì)其進(jìn)行測(cè)試的發(fā)現(xiàn)。
設(shè)置JDBC領(lǐng)域
首先,由于我們使用的是JDBC領(lǐng)域,所以我們假設(shè)我們已經(jīng)在JNDI jdbc/test下創(chuàng)建了到基礎(chǔ)數(shù)據(jù)庫(kù)的JDBC連接。
下一步是創(chuàng)建一個(gè)新領(lǐng)域。 您可以通過(guò)以下方法執(zhí)行此操作:轉(zhuǎn)到服務(wù)器配置>安全性>領(lǐng)域,然后添加一個(gè)新領(lǐng)域。 選擇領(lǐng)域類型com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm ,然后填充必填字段。
- 首先給您的新領(lǐng)域起一個(gè)名字。
- 對(duì)于JAAS上下文,將jdbcRealm
- 填充JNDI名稱,最好以"jndi/"開頭
接下來(lái),請(qǐng)注意其余字段。 Glassfish似乎希望看到兩個(gè)表。 第一個(gè)表包含用戶列表,其中用戶名是其唯一標(biāo)識(shí)符。 第二張表列出了每個(gè)用戶所屬的組。 用戶名是兩個(gè)表之間的外鍵鏈接。 (下一節(jié)應(yīng)該讓您更好地了解表格的外觀,畢竟它們非常簡(jiǎn)單)。
一旦創(chuàng)建了這些表,我們就可以相應(yīng)地填充必填字段。
填充數(shù)據(jù)庫(kù)以進(jìn)行測(cè)試
下一步是填充表以進(jìn)行測(cè)試。 假設(shè)我們將使用用戶名hpotter和password test 。 但是,對(duì)于密碼,請(qǐng)注意,Glassfish默認(rèn)情況下的摘要為SHA-256,如以下屏幕截圖所示。
因此,您需要在插入之前對(duì)密碼test進(jìn)行編碼。 您可以通過(guò)technipixel使用編碼器,這將為您提供字符串9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 。
下一步是編寫一些INSERT語(yǔ)句:
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;讓我們繼續(xù)下一步。
使用JAAS保護(hù)Web應(yīng)用程序的安全
關(guān)于JAAS的很多使用FORM認(rèn)證方法的教程。 但是,我想我再把它放在這里,希望有人會(huì)發(fā)現(xiàn)它更簡(jiǎn)單。
web.xml
對(duì)您的web.xml進(jìn)行以下修改
<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以便容器知道數(shù)據(jù)庫(kù)中組之間的映射以及應(yīng)用程序識(shí)別的角色。
<?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,則可能會(huì)為您生成此文件。
登錄頁(yè)面:login.html
如果我們?cè)俅螀⒖忌厦娴膚eb.xml ,請(qǐng)注意登錄頁(yè)面指向login.html 。 對(duì)于FORM身份驗(yàn)證方法,按照規(guī)范,我們需要使用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>完成所有這些操作后,我們可以啟動(dòng)Glassfish,部署我們的應(yīng)用程序并使用任何瀏覽器對(duì)其進(jìn)行測(cè)試。 訪問(wèn)該應(yīng)用程序后,應(yīng)將用戶定向到login.html進(jìn)行登錄。 請(qǐng)記住使用hpotter作為用戶名并test作為密碼。 成功登錄后,應(yīng)將用戶重定向到index.jsp (根據(jù)您的要求,該重定向又將用戶重定向到index.jsf或index.jsp重定向到的任何內(nèi)容)。
創(chuàng)建一個(gè)RESTFUL端點(diǎn)
當(dāng)然,下一步是創(chuàng)建一個(gè)RESTFUL端點(diǎn),這非常簡(jiǎn)單。 我在這里寫的一篇文章可能也很有用。
首先,假設(shè)我們具有以下應(yīng)用程序路徑。
package com.dwuysan;import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application;/*** @author denywuy*/ @ApplicationPath(value = "resources") public class ApplicationConfig extends Application { }讓我們假設(shè)我們具有以下簡(jiǎn)單的RESTFUL服務(wù)。
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);} }請(qǐng)注意,我們已使用javax.annotation.security.RolesAllowed批注保護(hù)了此服務(wù)的安全。
使用curl測(cè)試安全的RESTFUL服務(wù)
鑒于我們?cè)谏厦鎰?chuàng)建的RESTFUL服務(wù),我們應(yīng)該能夠使用CURL通過(guò)以下命令對(duì)其進(jìn)行測(cè)試:
curl -X GET -H "Accept:application/json" -H "Content-Type:application/json" http://localhost:8080/testApp/resources/generic/101上面的命令翻譯為以下內(nèi)容:使用GET命中上面的URL,標(biāo)題為Accept:application / json和Content-Type:application / json(cURL 2013)
由于我們已經(jīng)保護(hù)了我們的應(yīng)用程序,因此上述調(diào)用將無(wú)法進(jìn)行。 用戶將被重定向到login.html 。 因此,我們現(xiàn)在的目標(biāo)是首先登錄。 使用cURL,我們可以提交登錄參數(shù)(即用戶名和密碼),然后獲取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 (記住我們之前創(chuàng)建的login.html ),并將獲得的cookie存儲(chǔ)在cookies.txt文件cookies.txt 。
如果打開cookies.txt,則可能會(huì)看到以下內(nèi)容:
# 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注意:您可能會(huì)收到“文件移動(dòng)”響應(yīng)。 這意味著登錄已成功。 否則,您將再次獲得error.html的原始html。
成功通過(guò)身份驗(yàn)證后,我們可以使用從登錄名獲得的cookie來(lái)調(diào)用RESTFUL服務(wù)。
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參考文獻(xiàn):
- BalusC,2012年, ``基于JSF支持表單的安全性嗎'' ,2013年2月12日訪問(wèn)。
- Oracle,2013年, “保護(hù)Web應(yīng)用程序” ,2013年2月12日訪問(wèn)。
- Wolff,N,2005年, “如何使用帶有CURL的cookie處理身份驗(yàn)證?” ,2013年2月12日訪問(wèn)。
翻譯自: https://www.javacodegeeks.com/2013/09/jaas-secured-jax-rs-end-point.html
總結(jié)
以上是生活随笔為你收集整理的受JAAS保护的JAX-RS端点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 查看网卡linux(查看网卡 linux
- 下一篇: MongoDB和Web应用程序