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

在我之前的博客文章“ 检查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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python提取数据段_python提取数据段 python数据分析

如何在python中用slice分段取数据&#xff1f;执行以下操作&#xff1a;&gt&gt arange(6)&gt&gt a[0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5]&gt&gt a[0:3]&#xff0c;a[5][[2&#xff0c;3&#xff0c;4&#xff0c;4&a…

一个JAXB Nuance:字符串与枚举(受限制的XSD字符串)

尽管用于XML绑定的Java体系结构 &#xff08; JAXB &#xff09;在名义情况下&#xff08;尤其是自Java SE 6以来&#xff09; 相当容易使用&#xff0c;但它也存在许多细微差别。 一些常见的细微差别是由于无法将 XML模式定义 &#xff08;XSD&#xff09;类型与Java 类型精确…

休眠锁定模式– OPTIMISTIC_FORCE_INCREMENT锁定模式如何工作

介绍 在我以前的文章中 &#xff0c;我解释了OPTIMISTIC锁定模式是如何工作的&#xff0c;以及它如何帮助我们同步外部实体状态更改。 在本文中&#xff0c;我们将介绍OPTIMISTIC_FORCE_INCREMENT锁定模式的使用模式。 使用LockModeType.OPTIMISTIC &#xff0c;将在当前正在运…

设置本地Nexus存储库并从Maven部署WAR文件

Maven Central充当中央存储库管理器&#xff0c;其中二进制工件由不同的团队/公司/个人上载并与世界其他地方共享。 就像github和其他对源代码控制非常有效的源代码存储库一样&#xff0c;这些存储库管理器还充当您自己生成的二进制工件的部署目标。 设置本地存储库管理器具有…

mac solr mysql 配置文件_Solr配置文件浅析

接上一篇Linux下安装solr7.4&#xff0c;来谈谈solr的配置文件schema.xml和db-data-config.xml首先看schema.xml&#xff1a;idfield标签用来定义solr core中的字段。这里列出的三个字段如果没有特殊原因尽量保留。字段id被声明为uniqueKey,是让id来唯一标明一个solrdocument。…

JSF:在正确的阶段进行验证(了解生命周期)

嗨&#xff0c;大家好&#xff01; 尽管标题强调验证一词&#xff0c;但本文实际上是关于JSF生命周期的。 那是因为我相信&#xff0c;真正了解生命周期的最简单方法之一就是通过做出我们一直在做的事情&#xff1a;验证用户输入。 总的来说&#xff0c;理解所谓的JSF生命周期…

OpenShift v3:使用WildFly和MySQL的Java EE 7入门

OpenShift是Red Hat的开源PaaS平台。 OpenShift v3 &#xff08;将于今年发布&#xff09;将提供使用Docker和Kubernetes运行微服务的整体体验。 以经典的Red Hat方式&#xff0c;所有工作都在OpenShift Origin的开源中完成。 这也将推动OpenShift Online和OpenShift Enterpris…

mySQL日期函数并运行_mysql日期相关的函数

1、获取当前时间&#xff1a;/**获得当前日期时间(date time)函数&#xff1a;now(), 常用**/select now() fromdual;/**获取当前时间戳&#xff0c;current_timestamp或者current_timestamp()**/select current_timestamp, current_timestamp() fromdual;/**获得当前日期时间…

序列化对象C++对象的JSON序列化与反序列化探索

新手发帖&#xff0c;很多方面都是刚入门&#xff0c;有错误的地方请大家见谅&#xff0c;欢迎批评指正 一&#xff1a;背景 作为一名C开发人员&#xff0c;我始终很期待能够像C#与JAVA那样&#xff0c;可以省力的进行对象的序列化与反序列化&#xff0c;但到现在为止&#xff…

python socket udp并发_Python进阶----UDP协议使用socket通信,socketserver模块实现并发

Python进阶----UDP协议使用socket通信,socketserver模块实现并发一丶基于UDP协议的socket实现UDP协议传输数据代码如下:&#x1f447;### 客户端# -*-coding:utf-8-*-# Author:Dsimport socket# 实例化UDP协议的socket对象 ,配置参数, socket.SOCK_DGRAM(数据报)udp_clisocket.…

Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock

“ Arien看到了我们运行的parallelStreams和ForkJoin基准测试的结果后&#xff0c;在Twitter上与我们联系。 这激起了他的兴趣&#xff0c;因此他进行了一些自己的测试&#xff0c;将Quasar纤维加入了混合物。 这是他的结果和结论。” –塔基皮&#xff08;Takipi&#xff09;A…

WP8开发札记(一)WP8应用生命周期管理

在介绍生命周期前&#xff0c;我们先了解两个相关的概念。 1、墓碑机制&#xff1a;WP8与Android采用的真后台机制不同&#xff0c;WP8采用的是墓碑机制。一旦从当前应用程序离开&#xff08;非退出&#xff09;&#xff0c;该应用会被墓碑化&#xff0c;这样可以更好的管理&am…

python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

第8.3节Python类的__init__方法深入剖析&#xff1a;构造方法与继承详解一、 引言上两节介绍了构造方法的语法及参数&#xff0c;说明了构造方法是Python的类创建实例后首先执行的方法&#xff0c;并说明如果类没有重写构造方法&#xff0c;Python将会给出默认的__init__方法…

OpenShift DIY:使用Gradle构建Spring Boot / Undertow应用程序

由于此bug&#xff0c; Gradle 1.6是在OpenShift上运行的最后一个受支持的Gradle版本。 但是从Gradle 2.2开始&#xff0c;这不再是问题&#xff0c;因此使用自己动手做墨盒在OpenShift上运行最新的Gradle不再是问题。 DIY墨盒是一种实验性墨盒&#xff0c;它提供了一种在OpenS…

使用JAX-RS和Jetty创建Web服务和Rest Server

用Java创建WebService非常容易。 将其添加到ServletContainer并将其部署到嵌入式WebServer仅需要几行代码。 让我们创建一个具有两个函数的简单计算器&#xff0c;作为WebService的示例。 计算器将计算任何数量的squareRoot和平方。 它将返回一个简单的JSON响应&#xff0c;其…

maya 中使用节点连接来求余数:

绑个东西要用到求余&#xff0c;不喜欢用表达式&#xff0c;就想用节点连出来&#xff0c;找了下网上只有 镀金铆钉 在火星时代上的教程&#xff0c;不过不能下载了&#xff0c;就自己想了下&#xff0c;终于搞出来了&#xff0c;做下笔记&#xff0c;不要忘了。 求余的思路&a…

java web 登录界面案例_【JavaWeb】74:写一个登录案例

今天是刘小爱自学Java的第74天。感谢你的观看&#xff0c;谢谢你。话不多说&#xff0c;开始今天的学习&#xff1a;Java又常被称之为后台开发。什么叫后台呢&#xff1f;除了后台还有什么前台、前端后端……这些概念一大堆&#xff0c;还容易弄混。以一个三层架构的知识点来引…

7种JIRA集成可优化Java开发流程

有哪些最佳集成可以用来优化JIRA工作流程&#xff1f; 我喜欢寻找在工作流程中提高效率的方法。 看着那些小的自动化和流畅的流程&#xff0c;使我的脸上露出笑容。 我知道我并不孤单&#xff0c;偶尔花更多的时间来获得一点点提升以使其正常工作&#xff0c;而不是最终节省了我…

hive处理日志,自定义inputformat

开放环境&#xff0c;hadoop-0.20.2&#xff0c;hive-0.6 1.日志分隔符 Xml代码 2010-05-31 10:50:17|||61.132.4.82|||http://www.360buy.com/product/201185.html 2010-05-31 10:50:17|||61.132.4.82|||http://www.360buy.com/product/201185.html分隔符是“ ||| ”&#xf…

将ActiveMQ持久消息传递性能提高25倍

Apache ActiveMQ&#xff0c;JBoss A-MQ和Red Hat Apache ActiveMQ是一个非常受欢迎的开源消息传递代理&#xff0c;由创建&#xff08;和工作&#xff09; Apache Karaf &#xff0c; Apache Camel &#xff0c; Apache ServiceMix以及许多其他工具的人提供给您。 它拥有一个充…