shiro认证过程
Posted step-and-step
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()方法。
以上是关于shiro认证过程的主要内容,如果未能解决你的问题,请参考以下文章