1. 程式人生 > 實用技巧 >shiro認證過程

shiro認證過程

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()方法。