Shiro Subject設計概念


Subject

其擁有的行為:

       

Subject代表着用戶,用戶所擁有的行為包括:登錄、退出、校驗權限、獲得Session等,符合面向對象,門自己把自己關上了。

Subject.Builder

其擁有的行為:

接口里定義了Subject具備的行為,接口里邊寫Builder類,Subject通過Subject.Builder創建:(new Subject.Builder()).buildSubject();

其具備SubjectContext(擁有Subject的所有屬性信息)、SecurityManager(主要職責就是創建Subject)

該類負責SubjectContext的組裝,為其設置host、session、principals等

// 默認構造器中注入SecurityManager
public Builder() {
    this(SecurityUtils.getSecurityManager());
}

// 創建SubjectContext
public Builder(SecurityManager securityManager) {
    if (securityManager == null) {
        throw new NullPointerException("SecurityManager method argument cannot be null.");
    }
    this.securityManager = securityManager;
    this.subjectContext = newSubjectContextInstance();
    if (this.subjectContext == null) {
        throw new IllegalStateException("Subject instance returned from 'newSubjectContextInstance' " +
                "cannot be null.");
    }
    this.subjectContext.setSecurityManager(securityManager);
}

protected SubjectContext newSubjectContextInstance() {
    return new DefaultSubjectContext();
}

組裝SubjectContext

// 為SubjectContext設置值然后返回Builder實例
public Builder sessionId(Serializable sessionId) {
    if (sessionId != null) {
        this.subjectContext.setSessionId(sessionId);
    }
    return this;
}

public Builder host(String host) {
    if (StringUtils.hasText(host)) {
        this.subjectContext.setHost(host);
    }
    return this;
}

public Builder session(Session session) {
    if (session != null) {
        this.subjectContext.setSession(session);
    }
    return this;
}

// 使用
Builder builder = new Subject.Builder();
builder.sessionId("helloBuilder")
       .host("127.0.0.1");

創建Subject,使用SecurityManager根據SubjectContext創建Subject

public Subject buildSubject() {
    return this.securityManager.createSubject(this.subjectContext);
}

創建Subject的過程設計概念

Subject$Builder.buildSubject(SubjectContext)  ==>  SecurityManager.createSubject(SubjectContext)  ==>  SubjectFactory.createSubject(SubjectContext)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM