zoukankan      html  css  js  c++  java
  • 【Shiro】03 ini认证实现

    【基本概念】

    1、身份验证

    即在应用中谁能证明他就是他本人。

    一般提供如他们的身份ID 一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明。

    在 shiro 中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份:

    2、身份 principals 【/'prɪnsəpl】

    身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。

    一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号。

    3、凭证 credentials 【/krə'dɛnʃlz/】

    证明/凭证,即只有主体知道的安全值,如密码/数字证书等。

    最常见的principals和credentials组合就是用户名/密码了。

    认证流程

    新建一个Maven工程,如果后续功能很多,我们可以删除主工程的SRC目录

    再新建一个一个模块来开发学习。

    需要的依赖包的坐标:

        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-core</artifactId>
                <version>1.5.3</version>
            </dependency>
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.7.21</version>
                <scope>test</scope>
            </dependency>
            
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
                <version>1.7.21</version>
                <scope>test</scope>
            </dependency>
        </dependencies>

    日志配置文件:

    log4j.properties

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # MyBatis logging configuration...
    log4j.logger.org.mybatis.example.BlogMapper=TRACE
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    认证信息配置:

    shiro.ini

    #配置用户
    [users]admin=123456user=123456

    存放位置:

    编写测试类:

     代码中的用户信息即表示我们的目标主体的信息

    我们使用信息生成令牌进行登陆,对安全管理器加载好的ini认证信息进行核对

    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.mgt.DefaultSecurityManager;
    import org.apache.shiro.realm.text.IniRealm;
    import org.apache.shiro.subject.Subject;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * @author DaiZhiZhou
     * @file Shiro
     * @create 2020-08-01 16:47
     */
    public class AuthenticationTest {
    
        // 日志输出工具
        private static final transient Logger log = LoggerFactory.getLogger(AuthenticationTest.class);
    
        @SuppressWarnings("deprecation")
        public static void main(String[] args) {
            String username = "admin";
            String password = "123456";
            log.info("My First Apache Shiro Application");
    
            // 新版已经摈弃了工厂模式创建对象,直接使用DefaultSecurityManager创建实例
            DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
    
            // 认证配置信息单独由IniRealm创建加载
            IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
    
            // 在安全管理器中注册认证
            defaultSecurityManager.setRealm(iniRealm);
    
            // 在安全工具类中设置安全管理器
            SecurityUtils.setSecurityManager(defaultSecurityManager);
    
            // 得到目标主体
            Subject subject = SecurityUtils.getSubject();
    
            // 创建令牌实例
            AuthenticationToken userToken = new UsernamePasswordToken(username, password);
    
            try {
                // 主体携带令牌登陆
                subject.login(userToken);
    
            } catch (Exception exception) {
                exception.printStackTrace();
            }
    
            Subject subject2 = SecurityUtils.getSubject();
            aaaa();
            System.out.println(subject == subject2);
    
        }
    
        public static void quickStart(){
            // 1,创建安全管理器的工厂对象 org.apache.shiro.mgt.SecurityManager;  不能使用java.lang.SecurityManager
            //Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    
            // 2,使用工厂创建安全管理器
            //SecurityManager securityManager = factory.getInstance();
    
            // 3,把当前的安全管理器绑定当到线的线程
            //SecurityUtils.setSecurityManager(securityManager);
    
            // 4,使用SecurityUtils.getSubject得到主体对象
            //Subject subject = SecurityUtils.getSubject();
    
            // 5,封装用户名和密码
            //AuthenticationToken token = new UsernamePasswordToken(username, password);
    
            // 6,得到认证
            //try {
            //    subject.login(token);
            //    System.out.println("认证通过");
            //} catch (AuthenticationException e) {
            //    System.out.println("用户名或密码不正确");
            //}
            /*} catch (IncorrectCredentialsException e) {
                System.out.println("密码不正确");
            } catch (UnknownAccountException e) {
                System.out.println("用户名不存在");
            }*/
    
            //Subject subject2 = SecurityUtils.getSubject();
    
            //System.out.println(subject);
            //System.out.println(subject2);
    
            //aaaa();
        }
    
        public static void aaaa() {
            Subject subject2 = SecurityUtils.getSubject();
            System.out.println(subject2);
        }
    }
  • 相关阅读:
    Arduino IDE for ESP8266 项目云盒子 (1)AP直接模式
    Arduino IDE for ESP8266 项目云盒子(2)一键自配置+网页服务器
    Arduino IDE for ESP8266 项目(4)HTTP客户端+服务端
    远程桌面访问linux
    Arduino IDE for ESP8266 项目(3)创建AP+STA
    Arduino IDE for ESP8266 项目(2)wifi扫描
    Arduino IDE for ESP8266 项目(1) 点亮灯+按键LED+pwm
    双目SLAM(2) opencv
    双目SLAM(1) 总配置
    ORB-SLAM2(4) 离线双目数据测试
  • 原文地址:https://www.cnblogs.com/mindzone/p/13415034.html
Copyright © 2011-2022 走看看