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图中可以看到,IniSecurityManagerFactory类继承了IniFactorySupport类。IniFactorySupport类对基于INI配置生成实例的工厂实现提供基本支持,它继承了AbstractFactory类,而AbstractFactory类是Factory接口的实现。
IniSecurityManagerFactory类是基于INI配置创建SecurityManager实例的工厂。IniSecurityManagerFactory类有三个构造方法,分别为无参、接收一个Ini对象、接收一个表示ini文件路径的字符串。demo代码中使用的是下图中第三个构造方法,即传入一个表示ini文件路径的字符串。
向构造方法中传入表示ini文件路径的字符串后,涉及的调用如下:
- 调用Ini类的静态方法fromResourcePath(),并将路径传入该方法中。根据给定路径创建一个新的Ini实例,加载ini文件中的数据。资源路径必须是ResourceUtils.getInputStreamForPath方法可解释的值。结果返回一个Ini实例。
- 调用this()并传入fromResourcePath()返回的Ini对象。此时执行的是本类接收Ini对象作为参数的构造方法,它会使用this()调用本类的无参构造方法,再调用父类IniFactorySupport中的setIni()方法,并将接收到的Ini对象传进去,为父类中的私有Ini类型变量ini赋值。
- 调用本类无参构造方法时,会调用ReflectionBuilder类的无参构造方法,然后将返回的ReflectionBuilder对象赋值给类中的私有成员变量builder。ReflectionBuilder类是一个对象生成器。使用反射和Apache Commons BeanUtils来构造给定“属性-值”映射的对象。通常,它们来自Shiro INI配置,用于构造或修改SecurityManager、其依赖项和基于web的安全过滤器。