C/C++教程

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

本文主要是介绍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抽象工厂模式的UML图
从Shiro抽象工厂模式的UML图中可以看到,IniSecurityManagerFactory类继承了IniFactorySupport类。IniFactorySupport类对基于INI配置生成实例的工厂实现提供基本支持,它继承了AbstractFactory类,而AbstractFactory类是Factory接口的实现。

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

  1. 调用Ini类的静态方法fromResourcePath(),并将路径传入该方法中。根据给定路径创建一个新的Ini实例,加载ini文件中的数据。资源路径必须是ResourceUtils.getInputStreamForPath方法可解释的值。结果返回一个Ini实例。
    在这里插入图片描述
  2. 调用this()并传入fromResourcePath()返回的Ini对象。此时执行的是本类接收Ini对象作为参数的构造方法,它会使用this()调用本类的无参构造方法,再调用父类IniFactorySupport中的setIni()方法,并将接收到的Ini对象传进去,为父类中的私有Ini类型变量ini赋值。
    在这里插入图片描述在这里插入图片描述
  3. 调用本类无参构造方法时,会调用ReflectionBuilder类的无参构造方法,然后将返回的ReflectionBuilder对象赋值给类中的私有成员变量builder。ReflectionBuilder类是一个对象生成器。使用反射和Apache Commons BeanUtils来构造给定“属性-值”映射的对象。通常,它们来自Shiro INI配置,用于构造或修改SecurityManager、其依赖项和基于web的安全过滤器。
    在这里插入图片描述
这篇关于Shiro源码分析(一)——创建一个SecurityManager的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!