使用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.pswp.cn/news/374459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374459.shtml
英文地址,請注明出處:http://en.pswp.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;而今天的示例代碼是基于一…