shiro認證過程
阿新 • • 發佈:2020-07-15
shiro的認證過程原始碼分析
1.程式登入入口,頁面傳遞地引數userName,password ,loginType3個引數,用LoginUser 物件接收。loginType 為登入方式,因為我這裡有多種登入方式,因此用這個欄位來區分。不同的登入方式,採用不同的token封裝登入資訊。登入的過程就是呼叫Subject 的login方法,引數為封裝登入資訊的token。shiro用拋異常的方式來反饋登入結果,不同的異常代表不同的反饋結果。
public ResultBean login(LoginUser loginUser) { String userName = loginUser.getUserName(); String password= loginUser.getPassword(); String loginType = loginUser.getLoginType(); if (StringUtils.isAnyBlank(userName, password, loginType)) { return ResultBean.paramsError(); } Subject subject = SecurityUtils.getSubject(); AuthenticationToken token = null; if (PASSWORD_LOGIN.equals(loginType)) { token = new UsernamePasswordToken(userName, password); } else if (CODE_LOGIN.equals(loginType)) { token = new PhoneCodeToken(userName, password); } else { return ResultBean.failure("不支援的登入方式"); } String errorMsg= ""; try { subject.login(token);return ResultBean.success(user); } catch (UnknownAccountException e) { errorMsg = "無效賬戶"; } catch (IncorrectCredentialsException e) { errorMsg = "密碼錯誤"; } catch (CodeErrorException e) { errorMsg = "驗證碼錯誤/已過期"; } catch (LockedAccountException e) { errorMsg = "使用者已凍結"; } catch (AuthenticationException e) { errorMsg = "登入異常,請聯絡管理員"; logger.error("登入異常,{}", e.getMessage()); } return ResultBean.failure(errorMsg); }
2.重點看subject.login(token)方法。跟蹤進去,看到DelegatingSubject類的login()方法。DelegatingSubject為subject介面的實現類。可以看到,在login()方法裡面,呼叫SecurityManager的login()方法。