Spring Security 3 Ajax登錄–訪問受保護的資源

我看過一些有關Spring Security 3 Ajax登錄的博客,但是我找不到解決如何調用基于Ajax的登錄的博客,匿名用戶正在Ajax中訪問受保護的資源。

問題 – Web應用程序允許匿名訪問某些部分,并且某些部分是受保護的資源,需要用戶登錄。

當匿名用戶(通過Http Get / Post)訪問受保護的資源時,Spring Security會自動調用登錄頁面,并在成功通過身份驗證后重定向到所需的資源/頁面。

但是,如果正在Ajax中訪問受保護的資源,則登錄頁面將無法正確顯示(將在頁面的一部分上進行設置)。 302代碼(重定向到登錄頁面)將無法在Ajax中正常運行。

請注意,這與啟動Ajax登錄屏幕不同(例如,當用戶按下登錄按鈕并調用帶有用戶/密碼字段的彈出窗口時)。

那么–我們如何讓Spring Security 3通過“常規” HTTP Post(基于FORM的身份驗證)和Ajax調用來處理對受保護資源的訪問,包括在成功身份驗證后重定向到所需資源?

因此,此博客文章包含兩個保護層/部分:
1. Spring Security 3標準基于FORM的身份驗證
2.配置/擴展Spring Security 3.并且該應用程序還支持Ajax對受保護資源的訪問。

關于第1部分-有關此問題的參考很多。 無需詳細說明。

關于第2部分–要求以下內容:

1.配置Spring Security 3以啟用基于Ajax的登錄。
2.將客戶端Ajax調用配置為受保護的資源,以處理身份驗證請求。
3.重新執行功能以模擬成功登錄后自動進行用戶原始方法的調用(這在基于FORM的登錄中發生)

下圖描述了詳細的流程,應有助于遵循客戶端/服務器通信。

通過Ajax處理受保護的資源訪問

讓我們討論一下圖:

該流程始于對受保護資源(1)的匿名用戶Ajax請求。 在這種情況下,用戶希望將商品添加到購物車。

addItem方法是受保護的資源,它通過Spring Security(@pre_authorize(“ SOME_ROLE”))(2)受保護。 這使Spring Secutiry過濾器(3)發送帶有HTTP代碼302的登錄表單(即,重定向到該頁面)。

現在,由于這是一個Ajax調用,它將無法很好地處理請求,因此這里涉及到了登錄表單,將其放在一邊,然后調用基于Ajax的登錄(4):

客戶端Ajax方法(調用了Ajax addItem方法)檢查??它是基于表單的登錄名還是其他任何答復。 如果是基于FORM的登錄,它將調用一個對話框模式(5),該模式將嘗試登錄Ajax。 Spring將處理Ajax登錄認證(6)并將適當的消息返回給客戶端。 如果消息成功,則客戶端將重新執行原始功能,該功能試圖訪問受保護的資源(例如,本例中的addItem )。

讓我們看看它們如何適合我們的代碼:
步驟#1,#4 –客戶端訪問受保護的資源并檢查是否需要登錄

//JavaScript method - Ajax call to protected resource (#1 in flow diagram)
function addItem(itemId) {    $.ajax({url: '/my_url/order/addItem',type: 'POST',data: ({orderItemId : itemId,...}),               success: function(data) {//construct a callback string if user is not logged in.var cllbck = 'addItem('+itemId +')';//Client check if login required//(#4 in flow diagram)if (verifyAuthentication(data,cllbck)){// in here => access to protected resource was ok// show message to user, "item has been added..."}});}

步驟#2,#3 –是常規的Spring Security配置。 的大量資源 了 那里 。

步驟#4 –客戶端檢查是否需要登錄:

function verifyAuthentication(data, cllBackString){//naive check - I put a string in the login form, so I check for existanceif (isNaN(data) && (data.indexOf("login_hidden_for_ajax")!= -1)){//if got here then data is a loginform => login required//set callback in ajax login form hidden input  $("#my_callback").val(cllBackString); //show ajax login//Get the window height and widthvar winH = $(window).height();var winW = $(window).width();//Set the popup window to center$("#ajaxLogin").css('top',  winH/2-$("#ajaxLogin").height()/2);$("#ajaxLogin").css('left', winW/2-$("#ajaxLogin").width()/2);$("#ajaxLogin").fadeIn(2000); return false;} // data is not a login form => return true to continue with function processingreturn true; 
}

步驟#5,#7 – Ajax登錄表單使用以下Ajax登錄:

function ajaxLogin(form, suffix){var my_callback = form.my_callback.value; // The original function which accessed the protected resourcevar user_pass = form.j_ajax_password.value;var user_name = form.j_ajax_username.value; //Ajax login - we send credentials to j_spring_security_check (as in form based login$.ajax({url: "/myContextURL/j_spring_security_check",    data: { j_username: user_name , j_password: user_pass }, type: "POST",beforeSend: function (xhr) {xhr.setRequestHeader("X-Ajax-call", "true");},success: function(result) {     //if login is success, hide the login modal and//re-execute the function which called the protected resource//(#7 in the diagram flow)if (result == "ok") {$("#ajax_login_error_"+ suffix).html("");            $('#ajaxLogin').hide();if (my_callback!=null && my_callback!='undefined' && my_callback!=''){eval(my_callback.replace(/_/g,'"'));}return true;}else {        $("#ajax_login_error_"+ suffix).html('<span  class="alert display_b clear_b centeralign">Bad user/password</span>') ;return false;         }},error: function(XMLHttpRequest, textStatus, errorThrown){$("#ajax_login_error_"+ suffix).html("Bad user/password") ;return false; }
});
}

我們需要將Spring設置為支持Ajax登錄(#6):

設置Spring Security xml配置:

<beans:beans xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/security" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.3.xsd"><http auto-config="false" use-expressions="true"><intercept-url access="hasRole('ROLE_ADMIN')" pattern="/admin**"><intercept-url filters="none" pattern="/**"><intercept-url access="permitAll" pattern="/signin/**"><form-login authentication-failure-handler-ref="ajaxAuthenticationFailureHandler" authentication-success-handler-ref="ajaxAuthenticationSuccessHandler" login-page="/common/authentication/login"> <logout invalidate-session="true" logout-success-url="/common/authentication/logout"><custom-filter before="LOGOUT_FILTER" ref="logoutFilter"></custom-filter></logout></form-login></intercept-url></intercept-url></intercept-url></http>...
</beans:beans>

定義成功登錄的處理程序:

@Component("ajaxAuthenticationSuccessHandler")
public class AjaxAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { public AjaxAuthenticationSuccessHandler() {    }@Overridepublic void onAuthenticationSuccess(HttpServletRequest request,HttpServletResponse response, Authentication authentication)throws IOException, ServletException { HttpSession session = request.getSession();  DefaultSavedRequest defaultSavedRequest = (DefaultSavedRequest) session.getAttribute(WebAttributes.SAVED_REQUEST);//check if login is originated from ajax callif ("true".equals(request.getHeader("X-Ajax-call"))) {try {response.getWriter().print("ok");//return "ok" stringresponse.getWriter().flush();} catch (IOException e) {    //handle exception...}} else {      setAlwaysUseDefaultTargetUrl(false);  ...}}
}

為登錄失敗定義一個處理程序–與成功相同,但是字符串為“ not-ok”。

我知道這里的某些代碼不是最佳做法,所以我想聽聽您的想法。
如果您能看到改進流程或使其更通用的方法,請發給我。

鳴謝:通過gliffy完成了圖表-在線圖表工具

參考: Spring security 3 Ajax登錄–通過 Gal Levinsky博客博客中的JCG合作伙伴 Gal Levinsky 訪問受保護的資源 。


翻譯自: https://www.javacodegeeks.com/2012/08/spring-security-3-ajax-login-accessing.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372060.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372060.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

測試環境下將centos6.8升級到centos7的操作記錄(轉)

在測試環境下安裝openstack&#xff0c;由于在centos6下安裝openstack&#xff0c;針對源的問題有很多&#xff0c;安裝起來很不順利&#xff01; 但是在centos7下安裝卻很順利&#xff0c;所以考慮將服務器由centos6升級到centos7 這個我是在測試機中運行的&#xff0c;建議不…

linux運維選擇題,初學Linux練習題

1、將/etc/issue文件中的內容轉換為大寫后保存至/tmp/issue.out文件中tr ‘a-z’ ‘A-Z’ < /etc/issue > /tmp/issue.out2、將當前系統登錄用戶的信息轉換為大寫后保存至/tmp/who.out文件中3、一個linux用戶給root發郵件&#xff0c;要求郵件標題為”help”&#xff0c…

[轉]Web Api系列教程第2季(OData篇)(二)——使用Web Api創建只讀的OData服務

本文轉自&#xff1a;http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久沒更新了&#xff0c;之前有很多事情&#xff0c;所以拖了很久&#xff0c;非常抱歉。好了&#xff0c;廢話不多說&#xff0c;下面開始正題。本篇仍然使用上一季的的項目背景&#xff08;系列地址…

使用Spring 3 MVC處理表單

本文是有關Spring 3的一系列文章的一部分。該系列的上一篇文章可以在此處獲得 。 在本文中&#xff0c;我們向Spring MVC邁出了又一步。 [此外&#xff1a; 術語MVC的創建者提供的pdf 。]從上一篇文章構建&#xff0c;讓我們添加將“聯系人”添加到應用程序所需的代碼。 首先&a…

插入排序法之——直接插入排序、折半插入排序、希爾排序

// test20.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include<iostream> #include<vector> #include<string> #include<queue> #include<stack> #include<cstring> #include<string.h> #include<de…

linux idea 快捷鍵,Linux 下 IDEA 的 Ctrl+Alt+S

前言這是個困擾我一年多的問題&#xff0c;今天終于解決了……起因一年前將主系統換成 Arch Linux 后&#xff0c;其他一切正常就是 IDEA 的打開設置的快捷鍵 ctrlalts 失效&#xff0c;讓我很是頭疼。雖然不是很重要&#xff0c;但是對于我這種強迫癥來說別提多難受了……我曾…

修改input的placeholder顏色

1、CSS選擇器 因為每個瀏覽器的CSS選擇器有所差異&#xff0c;所以需要針對每個瀏覽器做單獨的設定。 ::-webkit-input-placeholder { /* WebKit browsers */ color: #999; } :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #999; } ::-moz-placeholder { /* Mozil…

解決Spring自動裝配中的循環依賴

我認為這篇文章是在企業應用程序開發中使用Spring的最佳實踐。 使用Spring編寫企業Web應用程序時&#xff0c;服務層中的服務量可能會增加。 服務層中的每個服務可能會消耗其他服務&#xff0c;這些服務將通過Autowire注入。 問題&#xff1a;當服務數量開始增加時&#xff0…

01.MD5加密

namespace _01.MD5加密{ class Program { static void Main(string[] args) { //MD5加密就是給想要的密碼或者其它字符加密 //如果字符串被加密成MD5值之后,是不可逆的. //字符串123 的MD5 64位加密形式是 202cb962ac59075b964b07152d234b70 Console.WriteLine("請輸入需要…

C語言數字3轉變字符 3 程序,大學c語言知識點總結

大學c語言知識點總結C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。一起來看看大學c語言知識點總結吧!大學c語言知識點總結1、編譯預處理不是C語言的一部分&#xff0c;不再運行時間。C語言編…

接觸Jenkins(Hudson)API,第1部分

哪一個-哈德森還是詹金斯&#xff1f; 都。 幾個月前&#xff0c;我開始使用Hudson v1.395來從事這個小項目&#xff0c;在出現巨大分歧之后又回到了這個項目。 我以此為契機&#xff0c;看我將來選擇永久搬到詹金斯時是否會遇到任何重大問題。 有很多麻煩-最值得注意的是&…

使用javascript模擬常見數據結構(四)

七、樹 樹是一種非線性的分層的數據結構&#xff0c;在現實生活中比較常見的例子比如家譜和公司的組織架構圖&#xff0c;如下所示&#xff1a; 一個樹結構存在著一系列的父子結構&#xff0c;并且有著一個根節點&#xff0c;這種結構本質上表明了一對多的關系。 那&#xff0c…

C語言中實際參數太多,c – 宏的實際參數太多了?

碼&#xff1a;#include using namespace std;#define ADD(x,y) ((x)(y))int main( int argc, char** argv ){cout << ADD(1,2,) << endl;return 0;}編譯器輸出&#xff1a;1>Compiling…1>main.cpp1>c:\warn_test\main.cpp(9) : warning C4002: too many…

Web開發框架–第2部分:Play Framework 2.0

作為 評估系列 的第一個候選人&#xff0c; 我們回顧了 Play Framework v2.0 。 可以從Play 文檔站點獲得本文所使用的教程和參考文檔。 本文的第一部分將介紹我們建議對每個框架執行的一組任務&#xff0c;然后繼續評估每個標準項。 在開發工作站中安裝框架 非常簡單&#…

最全Pycharm教程(10)——Pycharm調試器總篇

最全Pycharm教程&#xff08;1&#xff09;——定制外觀 最全Pycharm教程&#xff08;2&#xff09;——代碼風格 最全Pycharm教程&#xff08;3&#xff09;——代碼的調試、執行 最全Pycharm教程&#xff08;4&#xff09;——有關Python解釋器的相關配置 最全Pycharm教程&am…

Looper.prepare()和Looper.loop()

什么時候需要 Looper Looper用于封裝了android線程中的消息循環&#xff0c;默認情況下一個線程是不存在消息循環&#xff08;message loop&#xff09;的&#xff0c;需要調用Looper.prepare()來給線程創建一個消息循環&#xff0c;調用Looper.loop()來使消息循環起作用&#…

超速問題的c語言編程,超速行駛問題--精選.doc

超速行駛問題摘要本文主要研究的是探討驅車從始發地至目的地的最短時間路徑問題和最少花費問題&#xff0c;以及在超速情況下的最短時間和最少花費問題。首先&#xff0c;從整個題目的兩個問題入手&#xff0c;發現兩個問題都是優化問題&#xff0c;具有一定的聯系。然后針對第…

重新查看Play Framework發布的值

與Play Framework 2.0一起使用發布的值而不定義表單映射&#xff0c;可能不像Play 1.x那樣明顯&#xff0c;這就是為什么我要編寫此快速備忘單。 對于此快速示例&#xff0c;讓我們定義以下視圖&#xff1a; app / views / index.scala.html (message: String)message: messa…

matlab 微積分

符號變量&#xff0c;symbolic variable 1. 高階導數 高階導數的計算&#xff0c;當然可以用手工的方式&#xff0c;但顯然這種機械重復的推導&#xff0c;更適用于計算機的計算方式&#xff1a; f(x)sinxx24x3?d4fdx4>> syms x; >> f sin(x) / (x^24*x3); >&…

如何查看Ubuntu版本,以及Linux內核版本??

查看Ubuntu版本&#xff1a; 方法一&#xff1a; cat /etc/issue 方法二&#xff1a; sudo lsb_release -a 查看內核版本&#xff1a; uname -r 轉載于:https://www.cnblogs.com/tanrong/p/6937749.html