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)