使用Spring Security 3.1保护RESTful Web服务,第3部分

1.概述

本教程显示了如何使用Spring和基于Java的Spring Security 3.1保护REST服务 。 本文将重点介绍如何使用“登录和Cookie”方法专门针对REST API设置安全配置。

2.

Spring Security的体系结构完全基于Servlet过滤器,因此,在HTTP请求处理方面,Spring Security早于Spring MVC。 请记住,首先,需要在应用程序的web.xml中声明一个过滤器

<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>/*</url-pattern>
</filter-mapping>

该过滤器必须被命名为“ springSecurityFilterChain”,以匹配Spring Security在容器中创建的默认bean。

注意,定义的过滤器不是实现安全性逻辑的实际类,而是DelegatingFilterProxy ,其目的是将Filter的方法委托给内部Bean。 这样做是为了使目标bean仍然可以从Spring上下文生命周期和灵活性中受益。

用于配置过滤器的URL模式/ *即使整个Web服务被映射到/ API / *,这样的安全配置有如果需要,以确保其它可能的映射以及选项。

3.安全配置

<?xml version="1.0" encoding="UTF-8"?>
<beans:beansxmlns="http://www.springframework.org/schema/security"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:sec="http://www.springframework.org/schema/security"xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><http entry-point-ref="restAuthenticationEntryPoint"><intercept-url pattern="/api/admin/**" access="ROLE_ADMIN"/><form-login authentication-success-handler-ref="mySuccessHandler" /><logout /></http><beans:bean id="mySuccessHandler"class="org.rest.security.MySavedRequestAwareAuthenticationSuccessHandler"/><authentication-manager alias="authenticationManager"><authentication-provider><user-service><user name="temporary" password="temporary" authorities="ROLE_ADMIN"/><user name="user" password="user" authorities="ROLE_USER"/></user-service></authentication-provider></authentication-manager></beans:beans>

大多数配置都是使用安全性名称空间完成的-要启用此功能,必须定义架构位置并指向正确的3.1 XSD版本。 命名空间的设计使其能够表达Spring Security的常用用法,同时仍提供钩子原始bean来容纳更高级的场景。

3.1。 <http>元素

<http>元素是HTTP安全配置的主要容器元素。 在当前的实现中,它仅确保了一个映射: / api / admin / ** 。 注意,映射是相对于 Web应用程序的根上下文的,而不是相对于其余 Servlet的。 这是因为整个安全配置都存在于Spring的根上下文中,而不是在Servlet的子上下文中。

3.2。 入口点

在标准的Web应用程序中,当客户端尝试访问未经身份验证的安全资源时,身份验证过程可能会自动触发-这通常是通过重定向到登录页面以使用户可以输入凭据来完成的。 但是,对于REST Web服务,此行为没有多大意义-身份验证仅应通过对正确URI的请求来完成,而所有其他请求如果未通过身份验证,则应仅以401 UNAUTHORIZED状态代码失败。

Spring Security使用入口点的概念来处理自动触发的身份验证过程-这是配置的必需部分,可以通过<http>元素的entry-point-ref属性注入。 请记住,此功能在REST服务的上下文中没有意义,新的自定义入口点被定义为在被触发时仅返回401:

@Component( "restAuthenticationEntryPoint" )
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint{@Overridepublic void commence( HttpServletRequest request, HttpServletResponse response, AuthenticationException authException ) throws IOException{response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );}
}

3.3。 REST的登录表单

REST API的身份验证有多种方法-Spring Security提供的默认方法之一是表单登录 -使用身份验证处理过滤器– org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter

<form-login>元素将创建此过滤器,还将允许我们在其上设置自定义身份验证成功处理程序。 也可以通过使用<custom-filter>元素在FORM_LOGIN_FILTER位置注册过滤器来手动完成–但是名称空间支持足够灵活。

请注意,对于标准Web应用程序, <http>元素auto-config属性是一些有用的安全配置的简写语法。 尽管这对于某些非常简单的配置可能是适当的,但它并不适合并且不应用于REST API。

3.4。 身份验证应返回200而不是301

默认情况下,表单登录将使用301 MOVED PERMANENTLY状态代码回答成功的身份验证请求; 这在实际登录表单的上下文中是有意义的,该表单需要在登录后进行重定向。 但是,对于RESTful Web服务,成功身份验证所需的响应应为200 OK

这是通过在表单登录过滤器中注入自定义身份验证成功处理程序来完成的,以替换默认的成功处理程序 。 新的处理程序实现与默认的org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler完全相同的登录名,但有一个显着的区别–删除了重定向逻辑:

public class MySavedRequestAwareAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {private RequestCache requestCache = new HttpSessionRequestCache();@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {SavedRequest savedRequest = requestCache.getRequest(request, response);if (savedRequest == null) {clearAuthenticationAttributes(request);return;}String targetUrlParam = getTargetUrlParameter();if (isAlwaysUseDefaultTargetUrl() || (targetUrlParam != null && StringUtils.hasText(request.getParameter(targetUrlParam)))) {requestCache.removeRequest(request, response);clearAuthenticationAttributes(request);return;}clearAuthenticationAttributes(request);}public void setRequestCache(RequestCache requestCache) {this.requestCache = requestCache;}
}

3.5。 身份验证管理器和提供程序

身份验证过程使用内存中的提供程序执行身份验证-这是为了简化配置,因为这些工件的生产实现不在本文讨论范围之内。

3.6最后–针对正在运行的REST服务进行身份验证

现在,让我们看看如何针对REST API进行身份验证-登录的URL为/ j_spring_security_check-以及执行登录的简单curl命令为:

curl -i -X POST -d j_username=user -d j_password=userPass
http://localhost:8080/spring-security-rest/j_spring_security_check

该请求将返回Cookie,随后针对REST服务的任何后续请求都将使用该Cookie。

我们可以使用curl进行身份验证并将收到的cookie存储在文件中

curl -i -X POST -d j_username=user -d j_password=userPass -c /opt/cookies.txt
http://localhost:8080/spring-security-rest/j_spring_security_check

然后, 我们可以使用文件中的cookie进行进一步的身份验证请求:

curl -i --header "Accept:application/json" -X GET -b /opt/cookies.txt 
http://localhost:8080/spring-security-rest/api/foos

经过身份验证的请求将正确显示200 OK

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 24 Jul 2013 20:31:13 GMT[{"id":0,"name":"JbidXc"}]

4. Maven和其他麻烦

Web应用程序和REST服务所需的Spring 核心依赖关系已详细讨论。 为了安全起见,我们需要添加: spring-security-webspring-security-config-所有这些都已在Maven for Spring Security教程中进行了介绍。

值得密切关注Maven解决旧版Spring依赖项的方式–一旦将安全工件添加到pom中,解析策略将开始引起问题 。 为了解决这个问题,一些核心依赖项将需要被覆盖,以使其保持在正确的版本。

5.结论

这篇文章涵盖了使用Spring Security 3.1的RESTful服务的基本安全配置和实现,讨论了web.xml ,安全配置,用于身份验证过程的HTTP状态代码以及安全工件的Maven解析。

可以在github项目中找到该Spring Security REST教程的实现–这是一个基于Eclipse的项目,因此应该很容易直接导入和运行。

参考:来自bakgung博客的JCG合作伙伴 Eugen Paraschiv的Spring REST Service Security 3 。

翻译自: https://www.javacodegeeks.com/2011/11/securing-restful-web-service-with.html

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

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

相关文章

一次完整的HTTP请求所经历的7个步骤

HTTP通信机制是在一次完整的HTTP通信过程中&#xff0c;Web浏览器与Web服务器之间将完成下列7个步骤&#xff1a; 1、建立TCP连接 在HTTP工作开始之前&#xff0c;Web浏览器首先要通过网络与Web服务器建立连接&#xff0c;该连接是通过TCP来完成的&#xff0c;该协议与IP协议共…

jQuery基础--样式篇(3)

1.jQuiery对象与DOM对象   对于刚刚接触jQuery的初学者&#xff0c;我们要清楚认识一点&#xff1a;jQuery对象与DOM对象是不一样的。可能一时半会分不清楚哪些是jQuery对象&#xff0c;哪些是DOM对象&#xff0c;下面重点介绍一下jQuery对象&#xff0c;以及两者相互间的转换…

hls fifo_HLS优化方法DATAFLOW你用了吗

上期内容&#xff1a;异步跨时钟域电路该怎么约束DATAFLOW作为HLS的一种优化方法&#xff0c;对于改善吞吐率(Throughput)、降低延迟(Latency)非常有效。DATAFLOW的作用对象DATAFLOW可以作用于函数&#xff0c;也可以作用于for循环。如下图所示(图片来源Figure62, Figure 63, u…

Java 8虚拟扩展方法

我一直关注Java 8 Lambda表达式项目的发展已经有一段时间了&#xff0c;我对其当前的进展状态感到非常兴奋。 我发现的最新“易于理解”的演示文稿是这样的&#xff1a; http://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf 现在&#xff0c;作为一名…

python爬虫 库_七款必备的Python爬虫库,你知道几个?

很多你需要的信息数据都是在网站内&#xff0c;虽然有些网站的数据会以整洁、结构化的形式呈现&#xff0c;但大部分网站却无法做到这样。因此&#xff0c;当你想要获得一些数据的时候&#xff0c;你需要一些爬虫工具帮助抓取&#xff0c;然后再对其进行分析。今天&#xff0c;…

62个Android Studio小技巧合集

转载&#xff1a; 原文链接&#xff1a;http://laobie.github.io/android/2016/02/14/android-studio-tips.html转载于:https://www.cnblogs.com/kesteler/p/5618490.html

在Hibernate,EhCache,Quartz,DBCP和Spring中启用JMX

继续使用JMX的过程&#xff08;请参阅&#xff1a; 人类JMX &#xff09;&#xff0c;我们将学习如何在一些流行的框架中启用JMX支持&#xff08;通常是统计和监视功能&#xff09;。 这些信息大部分都可以在项目的主页上找到&#xff0c;但是我决定在收集这些信息的同时&#…

二叉树遍历(前中后)

二叉树前序遍历&#xff1a; /*** Definition for binary tree* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:vector<int> preorderTravers…

python语言程序设计实践教程答案实验六_Python程序设计实践教程

书名&#xff1a;Python程序设计实践教程 定价&#xff1a;29.8 ISBN&#xff1a;9787115532602 作者&#xff1a;储岳中 薛希玲 版次&#xff1a;*1版 出版时间&#xff1a;2020-04 内容提要&#xff1a; 本书是Python语言程序设计的配套实践教材&#xff0c;分为三部分&#…

400多万微信用户如何“变现”?凯叔说了五大秘诀与教训

凯叔&#xff0c;原名王凯&#xff0c;自媒体“凯叔讲故事”创始人&#xff0c;近日在狮享家班委会上做了分享&#xff0c;全是实实在在的实验性方法论。以下是王凯的分享内容&#xff0c;整理 / 垅青 我讲的主题叫“基于内容的MVP探索”&#xff0c;MVP是什么东西&#xff1f;…

使用dbUnit,JSON,HSQLDB和JUnit规则进行数据库单元测试

在本周TDD课程的运行中&#xff0c;我认为编写一些夹具以简化dbUnit的使用将很有趣。 我最初的想法只是教dbUnit有关JSON的知识&#xff0c;但事实证明Lieven Doclo已经做到了。 因此&#xff0c;我决定更进一步&#xff0c;还将dbUnit与JUnit Rules结合起来&#xff0c;并提供…

Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash

E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/problem/EDescription One day Kefa the parrot was walking down the street as he was on the way home from the restaurant when he saw something glittering by…

python文字游戏源代码求年纪_Python实现猜年龄游戏代码实例

1. 在猜年龄的基础上编写登录、注册方法&#xff0c;并且把猜年龄游戏分函数处理&#xff0c;如 2. 登录函数 3. 注册函数 4. 猜年龄函数 5. 选择奖品函数 代码如下 import json real_age 18 prize_list [好迪洗发水, 绿箭侠, 小猪佩奇, 布娃娃, 再来一次!] import random us…

KVC 与 KVO

一、Key-Value Coding (KVC)键值编码 KVC&#xff0c;即是指 NSKeyValueCoding&#xff0c;一个非正式的 Protocol&#xff0c;提供一种机制来间接访问对象的属性。KVO 就是基于 KVC 实现的关键技术之一。 一个对象拥有某些属性。比如说&#xff0c;一个 Person 对象有一个 nam…

使用模拟的单元测试–测试技术5

我的最后一个博客是有关测试代码方法的一系列博客中的第四篇&#xff0c;演示了如何创建使用存根对象隔离测试对象的单元测试。 今天的博客探讨了有时被视为对立的技术&#xff1a;使用模拟对象进行单元测试。 同样&#xff0c;我使用了从数据库检索地址的简单方案&#xff1a;…

多线程中的volatile和伪共享

伪共享 false sharing&#xff0c;顾名思义&#xff0c;“伪共享”就是“其实不是共享”。那什么是“共享”&#xff1f;多CPU同时访问同一块内存区域就是“共享”&#xff0c;就会产生冲突&#xff0c;需要控制协议来协调访问。会引起“共享”的最小内存区域大小就是一个cache…

C语言代码规范(一)缩进与换行

一、缩进的空格数为4个。最好配置代码编辑器将TAB键设置为空格替换&#xff0c;避免出现另一个编辑器打开时格式变乱的情况。 例如Notepad设置 KEIL设置 二、“{” 和 “}”各自独占一行。 不规范例子&#xff1a; for(i 0; i < student_num; i) { if((score[i] > 0…

armv7 cortex a系列编程手册_AWTK能为现代GUI编程带来何种改变?

AWTK是一个伸缩性极强的嵌入式图形框架&#xff0c;它的诞生会给GUI编程研发工程师带来哪些改变&#xff1f;AWTK是一个伸缩性极强的嵌入式图形框架&#xff0c;可在Cortex-M3这样低端的单片机上运行&#xff0c;也可以在Cortex-A7/A8/A9等处理器&#xff0c;甚至DSP以及X86处理…

【转】各种概念POJO、JAVABEAN、DAO、DTO、PO、VO、BO、SSH、EJB

POJO&#xff08;pure old java object&#xff09; 是普通java类&#xff0c;有一些private的参数作为对象的属性&#xff0c;然后针对每一个参数定义get和set方法访问的接口。我看到这个定义&#xff0c;心里就有个疑问了&#xff0c;这个POJO跟JavaBean的定义怎么就这么像&a…

为什么要编写单元测试–测试技巧8

我对最近在“您应该测试什么”上的博客有很多反应&#xff0c;有些人出于各种原因同意我的想法&#xff0c;另一些人则认为建议某些类可能不需要单元测试是非常危险的。 已经处理了什么测试&#xff0c;今天的博客涉及为什么要编写单元测试&#xff0c;而今天的示例代码是基于一…