Shiro——SecurityManager家族成员

文章目录

本文内容

Shiro——SecurityManager家族成员
这图很简单:

一堆接口作为基础功能。

下面各自都只实现一部分。

只有最底下的DSM不是抽象类。

接口们

Destroyable:可以选择死法。
CacheManagerAware:可以使用缓存管理器CM。
EventBusAware:可以通知事件总线EB。

Authorizer:鉴权功能。
Authenticator:登陆功能。
SessionManager:基础的会话功能(开启会话,获取会话)。

SecurityManager:
爸爸的:登陆,鉴权,会话开启与获取。
自己的:创建用户,会话登陆登出。

实现类们

可以根据各自的成员来推断功能:

CachingSM:缓存管理器,消息总线。

private CacheManager cacheManager;
private EventBus eventBus;

RealmSM:数据源。

private Collection<Realm> realms;

AuthenticatingSM:登录器。

private Authenticator authenticator;

AuthorizingSM:鉴权器。

private Authorizer authorizer;

SessionsSM:会话。

private SessionManager sessionManager;

DefaultSM:杂七杂八。

private static final Logger log = LoggerFactory.getLogger(DefaultSecurityManager.class);

protected RememberMeManager rememberMeManager;
protected SubjectDAO subjectDAO;
protected SubjectFactory subjectFactory;

资源的关闭过程

总是关闭当前层的资源,再调父类的关闭方法:

//SessionsSM
public void destroy() {
    LifecycleUtils.destroy(getSessionManager());
    this.sessionManager = null;
    super.destroy();
}
//AuthorizingSM
public void destroy() {
	LifecycleUtils.destroy(getAuthorizer());
	this.authorizer = null;
	super.destroy();
}
//AuthenticatingSM
public void destroy() {
	LifecycleUtils.destroy(getAuthenticator());
	this.authenticator = null;
	super.destroy();
}
//RealmSM
public void destroy() {
	LifecycleUtils.destroy(getRealms());
	this.realms = null;
	super.destroy();
}
//CachingSecurityManager
public void destroy() {
	LifecycleUtils.destroy(getCacheManager());
	this.cacheManager = null;
	LifecycleUtils.destroy(getEventBus());
	this.eventBus = new DefaultEventBus();
}

可以看到,一堆赋值null,还有调用LifecycleUtils。

public static void destroy(Object o) {
    if (o instanceof Destroyable) {
        destroy((Destroyable) o);
    } else if (o instanceof Collection) {
        destroy((Collection)o);
    }
}

垃圾分类。

public static void destroy(Destroyable d) {
    if (d != null) {
        try {
            d.destroy();
        } catch (Throwable t) {
            if (log.isDebugEnabled()) {
                String msg = "Unable to cleanly destroy instance [" + d + "] of type [" + d.getClass().getName() + "].";
                log.debug(msg, t);
            }
        }
    }
}

直接调用destroy()方法。

public static void destroy(Collection c) {
    if (c == null || c.isEmpty()) {
        return;
    }

    for (Object o : c) {
        destroy(o);
    }
}

空集合直接返回,非空则遍历之,对每一个成员递归地关闭。

上一篇:Qt-QSplashScreen启动画面(版权页)


下一篇:设置hive 参数