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 |