日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

受JAAS保护的JAX-RS端点

發布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 受JAAS保护的JAX-RS端点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

隨著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上下文,將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>

讓我們一一講解它們。

  • 這是成功登錄后將顯示的文件。 您也可以將此文件用作重定向。 例如,假設您有一個名為index.xhtml的文件(一個JSF頁面),則可以使用response.sendRedirect("index.jsf");
  • 這是實際的約束,即如何保護應用程序。 該部分基本上可以保護所有對應用程序的訪問,以/* url模式表示,并且僅允許以User和Admin角色訪問用戶。
  • 這部分表示我們正在使用的是FORM身份驗證方法(我將在下一節中對其進行詳細說明)。 重要的部分是確保所使用的安全領域的名稱正確,在這種情況下,該名稱為testRealm ,即與我們通過Glassfish管理頁面進行設置時提供的相同領域名稱。 另一部分是設置包含j_security_check的頁面,如果尚未驗證請求訪問權限,則應用程序將自動重定向到該頁面。
  • 已知角色
  • 與上一節相同。
  • 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日訪問。

    參考:在dwuysan博客博客中,由我們的JCG合作伙伴 Deny Wuysan提供了JAAS保護的JAX-RS端點 。

    翻譯自: https://www.javacodegeeks.com/2013/09/jaas-secured-jax-rs-end-point.html

    總結

    以上是生活随笔為你收集整理的受JAAS保护的JAX-RS端点的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。