在我之前的博客文章“ 检查REST API是否有效的快速方法–从清单文件中获取GET详细信息”中 ,我展示了如何开发REST资源以轻松检查开发的REST API是否可用。 在本文中,我将介绍如何使用Spring Security和基本身份验证来保护此资源的安全性– “在HTTP事务的上下文中,基本访问身份验证是HTTP用户代理在发出请求时提供用户名和密码的方法。”
此处介绍的受保护的REST资源是更大项目的一部分,在教程中进行了广泛介绍-REST API设计和Java以及Jersey和Spring的实现
使用的软件
- 泽西岛JAX-RS实现2.14
- Spring4.1.4
- Spring Security 3.2.5
- Maven 3.1.1
- JDK 7
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标头,其结构如下:
- 用户名和密码合并为字符串“ username:password”
- 然后,使用Base64的RFC2045-MIME变体对结果字符串进行编码,但不限于76个字符/行
- 然后将授权方法和一个空格(即“ Basic”)放置在编码字符串之前。
响应
回应–清单明细
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