1. 程式人生 > >Shiro的驗證機制 和同一瀏覽器 多次登入的BUG

Shiro的驗證機制 和同一瀏覽器 多次登入的BUG

關於一個瀏覽器同時登陸多個賬戶,自動跳轉到原登入頁面的邏輯錯誤。
方法1

對shiro原始碼進行了除錯,發現是AuthenticationFilter驗證邏輯的問題:
1.它首先驗證是否有允許訪問頁面(isAccessAllowed方法)。
2.在拒絕訪問中(FormAuthenticationFilter的onAccessDenied方法)才會進行判斷是否是登入提交(isLoginSubmission)。

因為已經登陸了一個使用者所以isAccessAllowed直接返回為true,進入LoginController,找到匹配方法fail直接返回LOGIN_PAGE。
由於有許可權訪問該登入(其他)頁面FormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME沒有值,返回為Null,所以在

keta-security中會跳轉到login頁面並且顯示"登陸失敗,其他錯誤!"。

分析、修改邏輯,首先驗證是否是登入操作,再進行驗證是否有許可權訪問頁面。繼承FormAuthenticationFilter,覆蓋isAccessAllowed方法。

01 /**
02
03 * @author  <a href="mailto:[email protected]">ketayao</a>
04
* Version  1.1.0
05 * @since   2012-10-29 上午9:37:02
06 */
07
08 public class BaseFormAuthenticationFilter extends FormAuthenticationFilter {
09 private static final Logger log = LoggerFactory.getLogger(BaseFormAuthenticationFilter.
class);
10
11 /**
12 *
13 * @param request

相關推薦

Shiro驗證機制 同一瀏覽器 登入BUG

關於一個瀏覽器同時登陸多個賬戶,自動跳轉到原登入頁面的邏輯錯誤。 方法1 對shiro原始碼進行了除錯,發現是AuthenticationFilter驗證邏輯的問題: 1.它首先驗證是否有允許訪問頁面(isAccessAllowed方法)。 2.在拒絕訪問中(FormAuthenticatio

一個使用者在同一個瀏覽器登入shiro互踢的問題

關鍵程式碼如下: //判斷是否同一個使用者再同一個瀏覽器中登入,是就不踢除 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws Authe

PC端chrome瀏覽器刷新

chrom TE 引用 新窗口 windows 關閉 資料 格式 CA 1.下載chrome瀏覽器。 2.打開想刷新的界面 3.Windows電腦,點擊F12. mac電腦右鍵-檢查。 4.切換到console。 5.復制下面的代碼: var timeout = promp

ThreadRunnable的區別聯絡、start一個執行緒會怎麼樣

一、Java有兩種方式實現多執行緒,第一個是繼承Thread類,第二個是實現Runnable介面。他們之間的聯絡:     1、Thread類實現了Runable介面。   2、都需要重寫裡面Run方法。 二、實現Runnable介面相對於繼承Thread類來說,有如下顯著的好處:

關於近期開發中遇到的同一賬戶登入造成資料庫資料不一致的思考解決(避開了資料庫存狀態的常用處理手段)

1.問題:近期開發了工單系統,開發結束專案上線測試過程中,發現同一賬戶多人同時登入如果不進行限制,該使用者的操作就不是唯一的,導致資料庫存放的資料出現了問題,專案整個就出問題了,經過本人再三思考,網上好多方案都是通過資料庫存一個登入狀態做處理,這樣的話又得對資料庫進行更改,很難受,那還有什麼其他的處理方案嗎?

javascript中bind()函式實現應用以及bind的結果引數位置的思考

改變物件方法裡this的值var ob = { name: 'joe', getName: function () { alert(this.name); } }; // 改變getName方法裡原本的this物件為新物件{name: 'haha'} var app = ob.getName.bi

Eclipse中Git的同一檔案修改push報出衝突[rejected

eclipse中自帶的Git外掛為Egit,通過操作圖形介面很方便我們日常的git操作。但最近發現了體驗極差的問題: 當對一個檔案作如下操作 第一次:   modify、add、commit、push 成功 第二次:   modify、add、commit、push 會

Firefox360瀏覽器 賬號同時登入

問題描述: 很多時候,我們的一個基於web的APP(應用)有多個賬號,且可能需要同時登入。假設我們有兩個QQ賬號,且我們想使用瀏覽器進行web QQ登入,該怎麼設定呢? 解決辦法: 一、Firefo

如何實現同一瀏覽器個標籤頁之間的通訊(一)——localStorage

一、localStorage (1)localStorage是什麼? localStorage物件在修訂過的HTML5規範中作為持久儲存在客戶端資料的方案取代了globalStorage,是Stor

同一瀏覽器個標籤頁之間的通訊(一)——localStorage

一、localStorage (1)localStorage是什麼? localStorage物件在修訂過的HTML5規範中作為持久儲存在客戶端資料的方案取代了globalStorage,是Storage的例項。 注意:要訪問一個localStorage物件,頁面必須來自同一

springboot中的攔截器interceptor過濾器filter,獲取request引數

大家好,我是烤鴨:    這是一篇關於springboot的攔截器(interceptor)和過濾器(Filter)。    先說一下過濾器和攔截器。區別:1.servlet請求,順序:Filter ——> interceptor。2.Filter的作用是對所有進行過濾

java 防止同一IP請求攻擊

需求: 防止入侵者,通過死迴圈同一時間批量向伺服器請求資料,導致伺服器記憶體開銷不斷膨脹,最後直接癱瘓。 開發環境: java + spring 攔截器 1. 新增一個spring的攔截器 , 攔截所有請求 &l

同一瀏覽器個標籤頁之間的通訊(二)——cookie+setInterval

二、cookie  (1)cookie是什麼?  HTTP Cookie,通常直接叫做cookie,最初是在客戶端用於儲存回話資訊的。該標準要求伺服器對任意HTTP請求傳送Set-CookieHTTP頭作為相應的一部分,其中包含回話資訊。瀏覽器會儲存這樣的回話資訊,並在這之後

利用C++的operator new實現同一物件呼叫建構函式

00417A60  push        ebp  00417A61  mov         ebp,esp 00417A63  push        0FFFFFFFFh 00417A65  push        offset __ehhandler$_main (425954h) 00417A6A

登入失敗使用者被鎖定及使用Pam_Tally2解鎖

在linux系統中,使用者多次登入失敗會被鎖定,一段時間內將不能再登入系統,這是一般會用到Pam_Tally2進行賬戶解鎖。 瞭解PAM Linux-PAM (Pluggable Authentication Modules for Linux)可插拔認證模組。Linux-PAM是一套適用於Linux的身

ie11edge瀏覽器下REM的bug

最近在做專案的時候,為了進行響應式的操作,採用了現在出現的一個新的單位——REM,在主流的瀏覽器都是沒什麼問題的。但是在ie出現了靈異的bug。 bug表述:載入頁面的時候,頁面的所有元素沒有按照對應獲取的js來計算出來的rem值來進行顯示。但是在滑鼠懸浮在對

php 一個賬號禁止瀏覽器使用者登入

思路:可以弄個隨機碼每次登陸的時候記錄到session和資料庫裡,然後做對比不一樣就退出登陸 程式碼: public function actionLogin() { if(isset

spring security 在沒實現session共享的叢集環境下 防止使用者登入的 實現思路

背景 專案採用阿里雲負載均衡,基於cookie的會話保持。 沒有實現叢集間的session共享。 專案採用spring security 並且配置了session策略如下: <bean class="or

Spring Security之登入失敗後賬戶鎖定功能的實現

在上一次寫的文章中,為大家說到了如何動態的從資料庫載入使用者、角色、許可權資訊,從而實現登入驗證及授權。在實際的開發過程中,我們通常會有這樣的一個需求:當用戶多次登入失敗的時候,我們應該將賬戶鎖定,等待一定的時間之後才能再次進行登入操作。 一、基礎知識回顧 要實現多次登入失敗賬戶鎖定的功能,我們需要先回顧

js實現每次程序發送一個數據 ,發送不一樣,5秒後繼續執行程序,判斷如果五秒後發送過來的數據上次不一樣,少的刪除的增加

增加 開始 後繼 tin key cli 監控 沒有 sop /*存儲設備ID*/var IDSNew = new Array();//判斷是否已經啟用服務var isopen = true;//需要放到接收設備數據處IDSNew[client.deviceId]=new