如何使用Spring Security和Basic身份验证保护Jersey REST服务
在我之前的博客文章“ 检查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
如何使用Spring Security和Basic身份验证保护Jersey REST服务相关推荐
- 使用Spring Security进行简单身份验证
朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 身份验证对于除了最基本的Web应 ...
- 使用Spring Security添加RememberMe身份验证
我在" 将社交登录添加到Jiwhiz博客"中提到,RememberMe功能不适用于Spring Social Security. 好吧,这是因为该应用程序现在不通过用户名和密码对用 ...
- java token身份认证_java – 基于Spring Security Token的身份验证
以下是我能够实现基于令牌的身份验证和基本身份验证的方法 SpringSecurityConfig.java @Configuration @EnableWebSecurity public class ...
- java登录密码验证失败_java – Spring Security:如果身份验证失败,则重定向到登录页面...
我们有两种登录方式. >用户名和密码由请求标头中的其他应用程序发送.检查IT,如果用户名和密码正确,则进入.[为此编写自定义过滤器] >如果请求标头中不存在用户名和密码,则会显示登录屏幕. ...
- Spring Boot+Spring Security+JWT 实现token验证
Spring Boot+Spring Security+JWT 实现token验证 什么是JWT? JWT的工作流程 JWT的主要应用场景 JWT的结构 SpringBoot+Spring Secur ...
- 使用Spring Security进行自动登录验证
** 原文来自师兄的博客 **: http://blog.csdn.net/df19900725/article/details/78085152 http://www.datalearner.com ...
- 基于 Spring Security OAuth2和 JWT 构建保护微服务系统
我们希望自己的微服务能够在用户登录之后才可以访问,而单独给每个微服务单独做用户权限模块就显得很弱了,从复用角度来说是需要重构的,从功能角度来说,也是欠缺的.尤其是前后端完全分离之后,我们的用户信息不一 ...
- 使用Spring Security和OAuth 2.0保护Spring微服务架构
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 每个开发 ...
- 使用React,Spring Boot和用户身份验证构建CRUD应用程序
建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现. 注册 ,再也不会建立auth了! Re ...
最新文章
- 1.75万亿参数,刚刚智源发布了全球最大预训练模型“悟道2.0”
- 数据解读:资本追逐的14个人工智能细分领域
- ARM 命名规则、架构
- boot lib分离 spring_SpringBoot+MyBatis+MySQL读写分离(实例)A
- PHP中利用header设置content-type和常见文件类型的content-type
- LTE TDD的特殊子帧
- MYBATIS 批量update 报错的问题
- 浅谈javascript继承【读javascript设计模式第四章节继承有感】
- 单例模式懒汉、饿汉和登记
- 双百双新产业项目是什么_投资380亿,广西38个“双百双新”产业项目开竣工
- python连接redis002
- Matlab中数组的常见用法
- uniapp阿里云STS上传文件
- 港澳台手机号正则表达式
- 固态硬盘怎么看出厂日期_如何查看SSD可以使用多长时间?固态硬盘寿命测试方法(全文)...
- OpenGL 渲染 YUYV(YUV422)
- HTML常见标签及个人简历制作
- leetcode6.Z 字形转换
- 图像去雾去雨去模糊去噪
- C++随机生成中文名的实例
热门文章
- java实现动态验证码源代码——jsp页面
- struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Action的实现类
- Hibernate中使用Criteria查询及注解——( EmpCondition)
- mybatis三种(查询,参数传递)
- 小学计算机学情分析报告,小学信息技术_重点文字图说话教学设计学情分析教材分析课后反思...
- Project编写功能点的规划时间
- linux驱动开发音频设备驱动,linux驱动开发—基于Device tree机制的驱动编写
- http响应状态码列表
- java的几种对象(PO,VO,DAO,BO,POJO)解释
- spring-boot--整合thymeleaf模板