如何使用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…

计算几何相关资料+题目推荐(不定期补充)

旋转卡壳&#xff1a;http://blog.csdn.net/accry/article/details/6070626 计算几何题目推荐&#xff1a;http://blog.csdn.net/accry/article/details/6070656 先是计算几何入门题推荐 &#xff1a; 计算几何题的特点与做题要领&#xff1a;1.大部分不会很难&#xff0c;少部…

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

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

weblogic概览下的上下文根配置_weblogic创建域

WebLogic 域配置策略在本文的 第一部分 (第 8 期,卷 3 , WLDJ )中,我曾向您详细介绍了可用于创建和配置域,以及经 过评估的指南和模板选项的不同策略。 ...startWebLogic.cmd 2.startWebLogic-8001.cmd 输入域的管理名和密码即可运行 新建一个停止脚本:stopWebLogic-8001.cmd 内…

ActiveMQ 持久化讯息数据库信息

www.MyException.Cn 发布于&#xff1a;2012-11-10 10:48:50 浏览&#xff1a;0次ActiveMQ 持久化消息数据库信息最近有网友问我&#xff0c;ActiveMQ持久化的中表结构是什么&#xff0c;表需要人工创建吗&#xff1f;我告诉他们不需要&#xff0c;ActiveMQ会帮助我们生成的…

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

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

java mysql nullpointerexception_无法从Java连接到MySQL:MySQL驱动程序连接逻辑中的NullPointerException...

我正在尝试连接到我在Java程序中使用MySQL创建的数据库,但它总是失败.为了举例,这是我的代码&#xff1a;import java.sql.*;public class Squirrel {public static void main(String[] args) {String user;String password;Connection connection;Statement statement;try {Cl…

Android应用中Back键的监听及处理

MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; import android.app.Activity; /*** Demo描述:* 处理Back键按下事件* * 注意事项:* 以下两种方法勿一起使用*/ public class MainActivity extends Activity {Overri…

设置本地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。…

JSP自定义标签_用简单标签控制标签体执行10次

什么也不说,直接上代码: import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport;//控制标签执行10次 public class SimpleTagDemo2 extends SimpleTagSupport …

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

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

mysql 更改root密码字段不存在_初次登陆MySQL修改密码是出现Unknown column 'password' in 'field list'的解决方法...

新安装的MySQL5.7&#xff0c;登录时提示密码错误&#xff0c;安装的时候并没有更改密码&#xff0c;后来通过免密码登录的方式更改密码&#xff0c;输入update mysql.user set passwordpassword(root) where userroot时提示ERROR 1054 (42S22): Unknown column password in f…

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…

《c陷阱与缺陷》笔记--注意边界值

如果要自己实现一个获取绝对值的函数&#xff0c;应该都没有问题&#xff0c;我这边也自己写了一个&#xff1a; void myabs(int i){if(i>0){printf("%d\n",i);}else{printf("%d\n",-i);} } 但是&#xff0c;这个函数真的没有问题吗&#xff1f;如果i的…

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…

Netflix监管者测试–引入了知事-Junit-runner

考虑一个典型的Netflix Governator junit测试。 public class SampleWithGovernatorJunitSupportTest {Rulepublic LifecycleTester tester new LifecycleTester();Testpublic void testExampleBeanInjection() throws Exception {tester.start();Injector injector tester.…

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.…

c++ 使用vs2010调用 win32api

以前读书时都是用vc6.0.后来学c#用vs。装系统只装了vs2010.今天用vs2010写c程序。发现有点陌生。就总结下&#xff0c;免得以后忘记。 首先用vs2010选择c语言。新建一个win32控制台程序。项目打开后会发现stdafx.h&#xff0c;targetver.h&#xff0c;stdafx.cpp还有自己的winA…