zoukankan      html  css  js  c++  java
  • frame shiro 认证示例及原理简述

    shiro 认证流程


    1、创建一个 javaSE 的maven项目(quickstart),并添加依赖

        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
          <version>1.2</version>
        </dependency>
        <dependency>
          <groupId>org.apache.shiro</groupId>
          <artifactId>shiro-core</artifactId>
          <version>1.3.2</version>
        </dependency>
    View Code

    2、添加shiro.ini配置文件

    添加shiro.ini配置文件的方式是为了简单展示shiro的用法

    在resources目录创建一个文件,文件名为shiro.ini

    文件添加内容如下:  

    [users]
    # 模拟数据库用户列表:账号=密码
    zhangsan=666
    lisi=888

    3、测试类代码

    package com.test.shiro;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    import org.junit.Test;
    
    public class ShiroTest {
        @Test
        public void testLogin() {
            // 加载配置文件,创建SecurityManager 工厂对象
            Factory<SecurityManager> securityManagerFactory = new IniSecurityManagerFactory("classpath:shiro.ini");
            // 通过工厂对象,创建 SecurityManager 对象
            SecurityManager securityManager = securityManagerFactory.getInstance();
            // 将securityManager绑定到当前运行环境中:让系统可以随时随地访问securityManager对象
            SecurityUtils.setSecurityManager(securityManager);
    
            // 创建登陆主体,此时主体还没有经过认证
            Subject subject = SecurityUtils.getSubject();
            // 创建主体登陆的身份/凭证,即账号/密码
            UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "666");
            // 主体登陆
            subject.login(token);
    
            // 判断登陆是否成功
            System.out.println("登陆是否成功:" + subject.isAuthenticated());
            // 主体登出
            subject.logout();
            // 判断登陆是否成功
            System.out.println("登陆是否成功:" + subject.isAuthenticated());
        }
    }
    View Code

    4、异常捕获

    用户名不存在异常:

    org.apache.shiro.authc.UnknownAccountException: Realm [org.apache.shiro.realm.text.IniRealm@6f79caec] was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - zhangsan1, rememberMe=false].

    凭证(密码)错误异常:

    org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - zhangsan, rememberMe=false] did not match the expected credentials.


    5、底层认证原理

      调用subject.login方法进行登录,其会自动委托给securityManager.login方法进行登录;securityManager通过Authenticator进行认证;Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带,相当于数据源);4、IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。

    a、页面将用户名密码封装为token并传入后台;

    b、subject调用login方法,传入参数token,以委托SecurityManager去认证

    c、启动程序时SecurityManager就已经加载了shiro.ini文件内容;SecurityManager调用自己的login方法,传入参数token、realm,以委托authenticator(认证器)去执行具体的认证

    d、authenticator执行认证

  • 相关阅读:
    oracle删除用户及其名下对象
    CENTOS7设置显示中文
    hadoop安装
    linux使用flock文件锁解决crontab冲突问题
    Hive On Spark和SparkSQL
    MapReduce和Tez对比
    安装python的redis模块
    拷贝一个用户下的所有表和数据到另外一个库
    java学习笔记10--泛型总结
    java学习笔记9--内部类总结
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/9665806.html
Copyright © 2011-2022 走看看