• (1)shiro简介和第一个demo


    之前一直在用shiro开发,不过只是会使用,并没有深入了解,最近有时间学习了一下,把最近学习所得分享一下。

     shiro简介

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序,

    相比于spring security更加的简洁和使用方便了。

    三个核心组件

    组件看不懂可以先把demo跑起来,然后回头再看,慢慢的体会就明白了。

    Subject:代表了当前访问系统的用户,不一定是人,也可以是爬虫等其他东西。

    SecurityManager:安全管理器,是shiro框架的核心。管理者subject,session等。

    Realms:可以看成是一个权限的数据源,用户登录认证和授权都是通过realm来进行的,可以设置多个realm。

    第一个demo

    添加pom文件

    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.2.2</version>
    </dependency>

    在classpath下新增一个shiro.ini文件。文件内容如下:(意思就是在这个系统中存在zhang这个用户,密码是123,后期会用存储在数据库中的账户密码,这里方便测试和讲解。。)

    [users]
    zhang=123

    测试代码:

            Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro.ini");
            //得到安全管理器
            SecurityManager securityManager = factory.getInstance();
    
            SecurityUtils.setSecurityManager(securityManager);
    
            Subject subject = SecurityUtils.getSubject();
    
            UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
    
            try {
                subject.login(token);
            } catch (AuthenticationException e) {
                e.printStackTrace();
            }
            System.out.println(subject.isAuthenticated());
            subject.logout();
    
            System.out.println(subject.isAuthenticated());

    最后输出

    true
    false。

    1首先通过IniSecurityManagerFactory和shiro.ini文件生成一个SecurityManager工厂。

    2获得该工厂的实例并托管给SecurityUtils这个类,其实就是放在了SecurityUtils这个类的一个static变量中,下面操作的底层还是SecurityManager里面的方法。

    3通过SecurityUtils得到一个主体对象,此时这个对象里面是没有数据的,也没有通过认证和授权,在SecurityUtils.getSubject获取的同时将当这个subject绑定到了当前线程里面。(如果你再getSubject也是该subject)

    4创建一个token绑定用户名和密码。然后调用subject.login进行登录(其实就是调用了SecurityManager进行认证和授权)

    shiro核心架构图:

    Authentication身份认证,通常用于校验密码等操作。

    Authorization授权,权限验证,校验用户是否拥有某种角色,或者某种更细的资源。

    创建SecurityManager步骤

    我们创建Security对象在java环境下创建了DefalutSecurityManager,它默认继承了AuthenticatingSecurityManager(认证器管理器),AuthorizingSecurityManager(授权器管理器)。

    这两个管理器分别持有Authenticator(认证器)和Authorizer(授权器)两个变量。(这里只贴图一张,还有一个可以看看源码)

    这两个在java环境下的实现类分别是,ModularRealmAuthenticator(默认认证器)和ModularRealmAuthorizer(默认授权器)

    并且在读取shiro.ini文件后默认创建了IniRealm对象,注入到上面的认证器和授权器中。(授权器也有个realms对象,realms存放着账号密码,对应的权限等信息)

    最后创建了一个SecurityManager对象。

    在调用subject.login(token);方法时候。会最终调用这个安全管理器的认证器对应的方法。

    登录的时候如果账号密码异常,会抛出对应的异常。(这里还绑定了session,shiro的session和web中的session是两个概念,后面介绍)

    到这里这个zhang的subject就登录成功了。

    github地址

    https://github.com/cmniefei/shiroparent

  • 相关阅读:
    X5webview完美去掉分享功能和缓存功能(2)
    bintray 在android3.2上传遇到的问题
    x5webview 自定义全屏界面
    X5webview去掉分享功能和缓存功能
    buglly热更新集成遇到的那些坑
    腾讯x5webview集成实战
    动态权限<三>华为小米特殊机制
    android 判断应用是否在前台显示
    动态权限<二>之淘宝、京东、网易新闻 权限申请交互设计对比分析
    android 图片二维码识别和保存(二)
  • 原文地址:https://www.cnblogs.com/nfcm/p/9870821.html
Copyright © 2020-2023  润新知