Shiro 中的 SessionStorageEvaluator

2019-02-14  本文已影响1人  JSON_NULL

DefaultSubjectDAO中有一个SessionStorageEvaluator类型的属性sessionStorageEvaluator;它是用于判断 Subject 是否可以使用 Session 来保存其内部状态的。SessionStorageEvaluator有两个实现DefaultSessionStorageEvaluatorDefaultWebSessionStorageEvaluator。并且DefaultWebSessionStorageEvaluator继承自DefaultSessionStorageEvaluator

使用SubjectSession来持久保存Subject的身份和身份验证状态(例如登录后)是一种常见的Shiro实现策略。在Session中保存Subject的内部信息时SessionId会被作为唯一标识。因此,Shiro可以基于Session重新创建Subject实例。这样就不再需要为所有请求/调用传递身份认证信息了。

但是,在纯粹的无状态应用程序中,例如某些REST应用程序或每个请求都经过身份验证的应用程序,通常不需要或不希望使用Session来存储此状态(因为它实际上是在每个请求上重新创建的)。在这些应用程序中,永远不会使用Session

此接口用于确定何时可以使用Session存储Subject的内部状态。

如果您只是希望在全局级别为所有Subject 启用或禁用Session,则 DefaultSessionStorageEvaluator应该足够了。而在Web环境中应该使用DefaultWebSessionStorageEvaluator

SessionStorageEvaluator 接口仅声明了这一个方法boolean isSessionStorageEnabled(Subject subject);,用于判断Subjecrt 对象是否可以被存储到Session中。

  1. 此方法返回 true 时表示 Subject 可以存储到Session
  2. 此方法返回 false 时表示 Subject 不可以存储到Session

DefaultSessionStorageEvaluator 类

DefaultSessionStorageEvaluator 中实现了SessionStorageEvaluator接口中的唯一方法boolean isSessionStorageEnabled(Subject subject);:

public boolean isSessionStorageEnabled(Subject subject) {
    return (subject != null && subject.getSession(false) != null) || isSessionStorageEnabled();
}

public boolean isSessionStorageEnabled() {
    return sessionStorageEnabled;
}

public void setSessionStorageEnabled(boolean sessionStorageEnabled) {
    this.sessionStorageEnabled = sessionStorageEnabled;
}

由以上代码可知,我们可以通过调用public void setSessionStorageEnabled(boolean sessionStorageEnabled)方法来设置sessionStorageEnabled属性,从而达到控制Subject是否被存储到Session目的。

DefaultWebSessionStorageEvaluator 类

@Override
public boolean isSessionStorageEnabled(Subject subject) {
    if (subject.getSession(false) != null) {
        //use what already exists
        return true;
    }

    if (!isSessionStorageEnabled()) {
        //honor global setting:
        return false;
    }

    //SHIRO-350: non-web subject instances can't be saved to web-only session managers:
    //since 1.2.1:
    if (!(subject instanceof WebSubject) && (this.sessionManager != null && !(this.sessionManager instanceof NativeSessionManager))) {
        return false;
    }

    return WebUtils._isSessionCreationEnabled(subject);
}

DefaultWebSessionStorageEvaluator是针对于Web环境的SessionStorageEvaluator,它 继承DefaultSessionStorageEvaluator 并重写了 public boolean isSessionStorageEnabled(Subject subject)方法。除执行与父类相同的逻辑外,还使用了 NoSessionCreationFilter 过滤器中的特定设置进行了扩展判断。具体如下:

  1. 如果NoSessionCreationFilter 在过滤器链中配置,则该过滤器将设置一个特定的 ServletRequest 属性指示禁用会话创建。
  2. DefaultWebSessionStorageEvaluator将检查此属性,如果已设置,isSessionStorageEnabled方法返回false ,从而阻止Shiro创建Session以存储Subject状态。
  3. 如果尚未设置请求属性(即NoSessionCreationFilter未配置或已禁用),则此类不执行任何操作,所有行为与其父类相同。
上一篇下一篇

猜你喜欢

热点阅读