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);
    }
View Code

2.重点看subject.login(token)方法。跟踪进去,看到DelegatingSubject类的login()方法。DelegatingSubject为subject接口的实现类。可以看到,在login()方法里面,调用SecurityManager的login()方法。

技术图片

 

以上是关于shiro认证过程的主要内容,如果未能解决你的问题,请参考以下文章

shiro登录认证过程讲解

2Shiro的认证

shiro认证过程

java shiro认证问题

Shiro 登录认证源码详解

shiro认证过程,怎样做才会走realm的认证方法