Shiro源码分析(一)——创建一个SecurityManager

2021SC@SDUSC

一.Demo代码

Quickstart.java

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.ini.IniSecurityManagerFactory;
import org.apache.shiro.lang.util.Factory;
import org.apache.shiro.mgt.SecurityManager;

public class Quickstart {

    public static void main(String[] args) {
    
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();

        SecurityUtils.setSecurityManager(securityManager);

        System.exit(0);
    }
}

shiro.ini

[users]
# 用户名:root 密码:secret 角色:admin
root = secret, admin
# 用户名:guest 密码:guest 角色:guest
guest = guest, guest
[roles]
# admin拥有全部权限,用通配符‘*’表示
admin = *

二.抽象工厂模式创建SecurityManager实例

Shiro源码分析(一)——创建一个SecurityManager
从Shiro抽象工厂模式的UML图中可以看到,IniSecurityManagerFactory类继承了IniFactorySupport类。IniFactorySupport类对基于INI配置生成实例的工厂实现提供基本支持,它继承了AbstractFactory类,而AbstractFactory类是Factory接口的实现。

IniSecurityManagerFactory类是基于INI配置创建SecurityManager实例的工厂。IniSecurityManagerFactory类有三个构造方法,分别为无参、接收一个Ini对象、接收一个表示ini文件路径的字符串。demo代码中使用的是下图中第三个构造方法,即传入一个表示ini文件路径的字符串。
Shiro源码分析(一)——创建一个SecurityManager
向构造方法中传入表示ini文件路径的字符串后,涉及的调用如下:

  1. 调用Ini类的静态方法fromResourcePath(),并将路径传入该方法中。根据给定路径创建一个新的Ini实例,加载ini文件中的数据。资源路径必须是ResourceUtils.getInputStreamForPath方法可解释的值。结果返回一个Ini实例。
    Shiro源码分析(一)——创建一个SecurityManager
  2. 调用this()并传入fromResourcePath()返回的Ini对象。此时执行的是本类接收Ini对象作为参数的构造方法,它会使用this()调用本类的无参构造方法,再调用父类IniFactorySupport中的setIni()方法,并将接收到的Ini对象传进去,为父类中的私有Ini类型变量ini赋值。
    Shiro源码分析(一)——创建一个SecurityManagerShiro源码分析(一)——创建一个SecurityManager
  3. 调用本类无参构造方法时,会调用ReflectionBuilder类的无参构造方法,然后将返回的ReflectionBuilder对象赋值给类中的私有成员变量builder。ReflectionBuilder类是一个对象生成器。使用反射和Apache Commons BeanUtils来构造给定“属性-值”映射的对象。通常,它们来自Shiro INI配置,用于构造或修改SecurityManager、其依赖项和基于web的安全过滤器。
    Shiro源码分析(一)——创建一个SecurityManager
上一篇:BUUCTF Windows系统密码


下一篇:安装MySQL的详细步骤