第二讲shiro异常及执行流程

在认证过程中,有一个父异常为:AuthenticationException

该异常有几个子类,分别对应不同的异常情况:

(1)DisabledAccountException:账户失效异常

(2)ExcessiveAttemptsException:尝试次数过多

(3)UnknownAccountException:用户不正确

(4)ExpiredCredentialsException:凭证过期异常

(5)IncorrectCredentialsException:凭证不正确

虽然shiro为每一种异常都提供了准确的异常类,但是在编写代码的过程中,应提示给用户的异常信息为模糊的,这样有助于安全。

常见的处理方式为:

UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "11121");
        try {
            // 6、进行用户身份验证
            subject.login(token);
            // 7、通过subject来判断用户是否通过验证
            if (subject.isAuthenticated()) {
                System.out.println("用户登录成功");
            }
        } catch (UnknownAccountException e) {// AuthenticationException为父异常 Ctrl+T看子异常
            System.out.println("用户名或密码不正确");
        } catch (IncorrectCredentialsException e) {
            System.out.println("用户名或密码不正确");
        }

执行流程:

(1)通过shiro的相关api,创建securityManager及获取Subject实例

        // 1、创建SecurityManager工厂,读取相应的配置文件
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        // 2、通过SecurityManager工厂获取SecurityManager的实例
        SecurityManager securityManager = factory.getInstance();
        // 3、将securityManager对象设置到运行环境中
        SecurityUtils.setSecurityManager(securityManager);
        // 4、通过SecurityUtils获取主体Subject
        Subject subject = SecurityUtils.getSubject();

(2)封装token信息

UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "1111");

(3)通过subject.login(token)进行用户认证

    Subject接收token,通过其实现类DelegatingSubject将token委托给SecurityManager来完成认证。SecurityManager通过是接口通过DefaultSecurityManager来完成相关的功能。由DefaultSecurityManager中login来完成认证过程。在login中调用了该类authenticae()来完成认证。该方法是由AuthenticatiingSecurityManager来完成的。在该类的authenticate()中,通过调用authenticator(认证器)来完成认证工作。Authenticator是由其默认实现类ModularRealmAuthenticatior来完成认证。通过ModularRealmAuthenticatior中的doAuthenticate来获取Realms信息。如果是单realm直接将token和realm中的数据进行比较,判断是否认证成功。如果是多realm,那么需要通过Authentication Strategy来完成对应的认证工作。

(4)通过subject.isAuthenticated()来判断是否认证成功。

上一篇:Shiro安全框架04:使用散列密码进行认证


下一篇:Apache Shiro架构-02