zoukankan      html  css  js  c++  java
  • 第二讲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()来判断是否认证成功。

  • 相关阅读:
    哈希查找之链地址法解决冲突(代码封装实现)
    kibana对logstash监控获取不到数据
    PL/SQL12中文版
    curl定时任务下载执行
    alias别名使用
    redhat7.0安装ifconfig
    WD backup西部盘数据备份
    Cecos国内集成系统基于rhel6.5
    Serv-U精简版FTP服务端
    [解决思路]ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file
  • 原文地址:https://www.cnblogs.com/116970u/p/10948185.html
Copyright © 2011-2022 走看看