javascript
如何使用Spring Security和Basic身份验证保护Jersey REST服务
在我之前的博客文章“ 檢查REST API是否有效的快速方法–從清單文件中獲取GET詳細信息”中 ,我展示了如何開發REST資源以輕松檢查開發的REST API是否可用。 在本文中,我將介紹如何使用Spring Security和基本身份驗證來保護此資源的安全性– “在HTTP事務的上下文中,基本訪問身份驗證是HTTP用戶代理在發出請求時提供用戶名和密碼的方法。”
此處介紹的受保護的REST資源是更大項目的一部分,在教程中進行了廣泛介紹-REST API設計和Java以及Jersey和Spring的實現
使用的軟件
Spring安全配置
圖書館
為了通過基本身份驗證保護REST服務,在類路徑中需要以下Spring安全性庫。 因為我使用的是Maven,所以它們在pom.xml中被列為Maven依賴項:
Spring安全性庫
<!-- Spring security --> <dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId><version>${spring.security.version}</version> </dependency> <dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>${spring.security.version}</version> </dependency> <dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>${spring.security.version}</version> </dependency>安全應用程序上下文
Spring安全配置
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:security="http://www.springframework.org/schema/security" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"><!-- Stateless RESTful services use BASIC authentication --><security:http create-session="stateless" pattern="/manifest/**"><security:intercept-url pattern="/**" access="ROLE_REST"/><security:http-basic/></security:http><security:authentication-manager><security:authentication-provider><security:user-service><security:user name="rest" password="rest" authorities="ROLE_REST"/></security:user-service></security:authentication-provider></security:authentication-manager></beans:beans>如您所見, “剩余”用戶和角色在內存中定義。 這些定義在元素<security:user-service>及其子元素<security:user> 。 這樣可以確保只有具有ROLE_REST角色的用戶才能訪問:
具有內存設置的身份驗證管理器
<security:authentication-manager><security:authentication-provider><security:user-service><security:user name="rest" password="rest" authorities="ROLE_REST"/></security:user-service></security:authentication-provider> </security:authentication-manager>下一步是保護/manifest/* URL,僅允許訪問新定義的休息用戶:
通過基于角色的訪問保護URL
<security:http create-session="stateless" pattern="/manifest/**"><security:intercept-url pattern="/**" access="ROLE_REST"/><security:http-basic/> </security:http>在我們的應用程序中,通過<security:http-basic/>行啟用了基本HTTP身份驗證。
注意:
您不能在applicationContext.xml文件中定義Spring Security的安全性約束,因為它們需要與Servlet偵聽器和過濾器鏈一起加載。 它們需要位于由Servlet偵聽器定義的適當的WebApplicationContext中,而不是與Servlet相關的偵聽器中。 這是因為DelegatingFilterProxy將查找ContextLoaderListener加載的ServletContext中定義的根應用程序上下文。 如果僅定義applicationContext.xml,因為過濾器首先加載,則在servlet之前加載,篩選器將無法找到任何應??用程序上下文,因此將無法正確加載。
Web.xml
現在擴展contextConfigLocation上下文參數,以了解新的spring安全配置文件security-context.xml :
web.xml –上下文參數擴展
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext.xmlclasspath:spring/security-context.xml</param-value> </context-param>僅針對與清單相關的URL鉤住Spring安全性:
鉤住Spring安全
<servlet><servlet-name>jersey-servlet</servlet-name><servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class><init-param><param-name>javax.ws.rs.Application</param-name><param-value>org.codingpedia.demo.rest.RestDemoJaxRsApplication</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet><servlet-mapping><servlet-name>jersey-servlet</servlet-name><url-pattern>/*</url-pattern> </servlet-mapping><!--Hook into spring security--> <filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter><filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern>/manifest/*</url-pattern> </filter-mapping>Spring安全過濾器鏈需要激活。
測試中
瀏覽器
如果您通過瀏覽器訪問受保護的位置,則會顯示一個標準HTTP身份驗證彈出窗口,詢問身份驗證詳細信息:
放置休息/休息 ,您應該會收到JSON響應。
SoapUI
通過soapUI使用基本身份驗證測試安全的REST相當容易。 觀看以下視頻以了解更多信息:
請求
使用基本身份驗證請求資源
GET http://localhost:8888/demo-rest-jersey-spring/manifest HTTP/1.1 Accept-Encoding: gzip,deflate Accept: application/json Host: localhost:8888 Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1.1 (java 1.5) Authorization: Basic cmVzdDpyZXN0請注意Authorization標頭,其結構如下:
響應
回應–清單明細
HTTP/1.1 200 OK Date: Tue, 03 Feb 2015 15:47:32 GMT Content-Type: application/json Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST, DELETE, PUT Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 196 Server: Jetty(9.2.6.v20141205){"Implementation-Title":"DemoRestWS","Implementation-Version":"0.0.1-SNAPSHOT","Implementation-Vendor-Id":"org.codingpedia","Built-By":"Matei1.Adrian","Build-Jdk":"1.7.0_40","Manifest-Version":"1.0","Created-By":"Apache Maven 3.1.1","Specification-Title":"DemoRestWS","Specification-Version":"0.0.1-SNAPSHOT"}摘要
好吧,就是這樣。 Spring Security是一個非常強大的框架,帶有大量的配置選項。 在本文中,我僅演示了其中之一,即如何使用基本身份驗證來保護REST資源。 當然,在更現實的情況下,您可以將用戶和角色存儲在LDAP目錄或數據庫中……
注意:如果您決定使用基本身份驗證來保護REST資源,請確保通過HTTPS調用它們。 如今,保護REST資源安全的首選方法是使用OAuth 。 有關更多信息,請參見稍后的文章。
翻譯自: https://www.javacodegeeks.com/2015/02/secure-jersey-rest-services-spring-security-basic-authentication.html
總結
以上是生活随笔為你收集整理的如何使用Spring Security和Basic身份验证保护Jersey REST服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔百和电脑版(魔百盒手机版)
- 下一篇: 一个JAXB Nuance:字符串与枚举