在我之前的博客文章“ 检查REST API是否有效的快速方法–从清单文件中获取GET详细信息”中 ,我展示了如何开发REST资源以轻松检查开发的REST API是否可用。 在本文中,我将介绍如何使用Spring Security和基本身份验证来保护此资源的安全性– “在HTTP事务的上下文中,基本访问身份验证是HTTP用户代理在发出请求时提供用户名和密码的方法。”

此处介绍的受保护的REST资源是更大项目的一部分,在教程中进行了广泛介绍-REST API设计和Java以及Jersey和Spring的实现

使用的软件

  1. 泽西岛JAX-RS实现2.14
  2. Spring4.1.4
  3. Spring Security 3.2.5
  4. Maven 3.1.1
  5. 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标头,其结构如下:

  1. 用户名和密码合并为字符串“ username:password”
  2. 然后,使用Base64的RFC2045-MIME变体对结果字符串进行编码,但不限于76个字符/行
  3. 然后将授权方法和一个空格(即“ 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

如何使用Spring Security和Basic身份验证保护Jersey REST服务相关推荐

  1. 使用Spring Security进行简单身份验证

    朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 身份验证对于除了最基本的Web应 ...

  2. 使用Spring Security添加RememberMe身份验证

    我在" 将社交登录添加到Jiwhiz博客"中提到,RememberMe功能不适用于Spring Social Security. 好吧,这是因为该应用程序现在不通过用户名和密码对用 ...

  3. java token身份认证_java – 基于Spring Security Token的身份验证

    以下是我能够实现基于令牌的身份验证和基本身份验证的方法 SpringSecurityConfig.java @Configuration @EnableWebSecurity public class ...

  4. java登录密码验证失败_java – Spring Security:如果身份验证失败,则重定向到登录页面...

    我们有两种登录方式. >用户名和密码由请求标头中的其他应用程序发送.检查IT,如果用户名和密码正确,则进入.[为此编写自定义过滤器] >如果请求标头中不存在用户名和密码,则会显示登录屏幕. ...

  5. Spring Boot+Spring Security+JWT 实现token验证

    Spring Boot+Spring Security+JWT 实现token验证 什么是JWT? JWT的工作流程 JWT的主要应用场景 JWT的结构 SpringBoot+Spring Secur ...

  6. 使用Spring Security进行自动登录验证

    ** 原文来自师兄的博客 **: http://blog.csdn.net/df19900725/article/details/78085152 http://www.datalearner.com ...

  7. 基于 Spring Security OAuth2和 JWT 构建保护微服务系统

    我们希望自己的微服务能够在用户登录之后才可以访问,而单独给每个微服务单独做用户权限模块就显得很弱了,从复用角度来说是需要重构的,从功能角度来说,也是欠缺的.尤其是前后端完全分离之后,我们的用户信息不一 ...

  8. 使用Spring Security和OAuth 2.0保护Spring微服务架构

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 每个开发 ...

  9. 使用React,Spring Boot和用户身份验证构建CRUD应用程序

    建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现. 注册 ,再也不会建立auth了! Re ...

最新文章

  1. 1.75万亿参数,刚刚智源发布了全球最大预训练模型“悟道2.0”
  2. 数据解读:资本追逐的14个人工智能细分领域
  3. ARM 命名规则、架构
  4. boot lib分离 spring_SpringBoot+MyBatis+MySQL读写分离(实例)A
  5. PHP中利用header设置content-type和常见文件类型的content-type
  6. LTE TDD的特殊子帧
  7. MYBATIS 批量update 报错的问题
  8. 浅谈javascript继承【读javascript设计模式第四章节继承有感】
  9. 单例模式懒汉、饿汉和登记
  10. 双百双新产业项目是什么_投资380亿,广西38个“双百双新”产业项目开竣工
  11. python连接redis002
  12. Matlab中数组的常见用法
  13. uniapp阿里云STS上传文件
  14. 港澳台手机号正则表达式
  15. 固态硬盘怎么看出厂日期_如何查看SSD可以使用多长时间?固态硬盘寿命测试方法(全文)...
  16. OpenGL 渲染 YUYV(YUV422)
  17. HTML常见标签及个人简历制作
  18. leetcode6.Z 字形转换
  19. 图像去雾去雨去模糊去噪
  20. C++随机生成中文名的实例

热门文章

  1. java实现动态验证码源代码——jsp页面
  2. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Action的实现类
  3. Hibernate中使用Criteria查询及注解——( EmpCondition)
  4. mybatis三种(查询,参数传递)
  5. 小学计算机学情分析报告,小学信息技术_重点文字图说话教学设计学情分析教材分析课后反思...
  6. Project编写功能点的规划时间
  7. linux驱动开发音频设备驱动,linux驱动开发—基于Device tree机制的驱动编写
  8. http响应状态码列表
  9. java的几种对象(PO,VO,DAO,BO,POJO)解释
  10. spring-boot--整合thymeleaf模板