01. shiro源码解读(一)

103 阅读1分钟

1. DefaultSecurityManager [类]

1.1 DefaultSecurityManager 的继承关系

image.png

1.1.1 DefaultSecurityManager的无参构造方法

image.png

/**
 * Default no-arg constructor.
 */
public DefaultSecurityManager() {
    super();
    this.subjectFactory = new DefaultSubjectFactory();
    this.subjectDAO = new DefaultSubjectDAO();
}

RealmSecurityManager [类]

1.2 setRealm()方法

realm英文原意:领域、场所

Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

设置单个realm

public void setRealm(Realm realm) {
    if (realm == null) {
        throw new IllegalArgumentException("Realm argument cannot be null");
    }
    Collection<Realm> realms = new ArrayList<Realm>(1);
    realms.add(realm);
    setRealms(realms);
}

setRealm(Realm realm) 的参数列表里需要一个Realm

此Realm 是一个接口。

image.png image.png

1.3 Realm [接口]

1.3.1 查看Realm接口的所有实现类

image.png

1.4 IniRealm [类]

image.png

IniRealm 中有一个有参构造方法

这个有参构造方法,一般是将我们shirio.ini文件设置进去。

public IniRealm(String resourcePath) {
    this();
    Ini ini = Ini.fromResourcePath(resourcePath);
    this.ini = ini;
    this.resourcePath = resourcePath;
    processDefinitions(ini);
}

image.png

DefaultSecurityManager可以设置setRealm

DefaultSecurityManager可以设置setRealm

// 1. 初始化shiro的安全管理器
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();

// 2. 设置用户的权限信息到安全管理器
Realm realm = new IniRealm("classpath:shirio.ini");

defaultSecurityManager.setRealm(realm);

但是看看继承关系 image.png

setRealm() 方法是类 RealmSecurityManager中的方法,为什么能调用呢?

因为DefaultSecurityManager 继承了RealmSecurityManager,就可以调用RealmSecurityManager类中的方法。

UsernamePasswordToken

在创建token令牌,记录用户认证的身份和凭证即账号和密码的时候,会用到UsernamePasswordToken类,它有一个接口AuthenticationToken,我们一般都是

AuthenticationToken usernamePasswordToken =
        new UsernamePasswordToken(username,password);

image.png