Heim  >  Artikel  >  Java  >  Detaillierte Einführung in den Shiro-Quellcode

Detaillierte Einführung in den Shiro-Quellcode

零下一度
零下一度Original
2017-07-26 16:36:441872Durchsuche

" classpath:shiro.ini")

2. Die Klassenstruktur der Fabrikklasse ist:
(3) Die abstractFactory-Klasse legt hauptsächlich fest, ob es sich um einen Singleton
(4) iniFactorySupport handelt ein Objekt, das durch die Unterstützung von INI-Einstellungen erstellt wurde

(5) iniSecuritymanagerFactory ist die Implementierungsklasse zum Erstellen von securityManager im INI-Modus

(2)
//2 Holen Sie sich die SecurityManager-Instanz und binden Sie es an SecurityUtils

org.apache.shiro.mgt.SecurityManagersecurityManager = Factory.getInstance();SecurityUtils. setSecurityManager(securityManager);
(1) Erstellen Sie ein Securitymanager-Objekt über das erstellte Ini-Objekt
(2) Über das erstellte Ini-Objekt Securitymanager-Objekt erstellen
1  IniSecurityManagerFactory类:2      creatSecuritymanager(ini){3      SecurityManager securityManager = createSecurityManager(ini);4      return securityManager;5  }

(3) Securitymanager erstellen
 1 private SecurityManager createSecurityManager(Ini ini) { 2 //null 3 Ini.Section mainSection = ini.getSection(MAIN_SECTION_NAME); 4 if (CollectionUtils.isEmpty(mainSection)) { 5  6 //try the default: null 7 mainSection = ini.getSection(Ini.DEFAULT_SECTION_NAME); 8 } 9  return createSecurityManager(ini, mainSection);10  }

(4) Legen Sie die Zuordnung zwischen Objekten über mainSession und dem Standardobjektobjekt fest

 1 private SecurityManager createSecurityManager(Ini ini, Ini.Section mainSection) { 2 //{securityManager=DefaultSecurityManager,iniRealm=IniRealm}   3 Map defaults = createDefaults(ini, mainSection); 4 Map objects = buildInstances(mainSection, defaults); 5  6 SecurityManager securityManager = getSecurityManagerBean(); 7 boolean autoApplyRealms = isAutoApplyRealms(securityManager); 8 if (autoApplyRealms) { 9 //realms and realm factory might have been created - pull them out first  so we can initialize the securityManager:10  Collection realms = getRealms(objects);11  //set them on the SecurityManager12  if (!CollectionUtils.isEmpty(realms)) {13          applyRealmsToSecurityManager(realms, securityManager);14            }15         }16        return securityManager;17     }
(5) Da IniRealm Initializable implementiert, initialisieren Sie das IniRealm-Objekt
 1 private Map buildInstances(Ini.Section section, Map defaults) { 2      this.builder = new ReflectionBuilder(defaults); 3      return this.builder.buildObjects(section); 4      } 5 //类ReflectionBuilder 6 //通过mainSection创建对象并关联 7  public Map buildObjects(Map kvPairs) { 8   ..... 9  LifecycleUtils.init(objects.values());10 }
Die Klassenstruktur von IniRealm ist:
 1 //类IniRealm 2 private void processDefinitions(Ini ini) { 3  Ini.Section usersSection = ini.getSection(USERS_SECTION_NAME); 4  processUserDefinitions(usersSection); 5 } 6 //通过userSection解析user模块 7  protected void processUserDefinitions(Map userDefs) { 8       for (String username : userDefs.keySet()) { 9          ........10       account = new SimpleAccount(username, password, getName());11       add(account);12         ........13        }14  }15 protected void add(SimpleAccount account) {16    String username = getUsername(account);17    USERS_LOCK.writeLock().lock();18    try {19     this.users.put(username, account);20    }finally {21     USERS_LOCK.writeLock().unlock();22 }
Die Struktur von simpleAccount ist:


An diesem Punkt ist die Objektzuordnung erstellt und die Initialisierung von IniRealm abgeschlossen! Schauen Sie sich als Nächstes das Strukturdiagramm von DefaultSecurityManager an:
(7) Legen Sie das Realm-Attribut von DefaultSecurityManager fest:
Hinweis:
afterRealmsSet(); wird hauptsächlich zum Festlegen der Bereichsattribute von Authenticator und Authorizer verwendet:
Bisher DefaultSecurityManager Die Eigenschaftseinstellung ist abgeschlossen und das DefaultSecurityManager-Objekt wird zurückgegeben
1  applyRealmsToSecurityManager(realms, securityManager){2     ((RealmSecurityManager) securityManager).setRealms(realms);3 }4 //在类RealmSecurityManager中5 public void setRealms(Collection realms) {6    this.realms = realms;7    afterRealmsSet();8 }

//3. Holen Sie sich den Betreff und erstellen Sie das Benutzername/Passwort-Authentifizierungstoken (d. h. Benutzeridentität). /credential)

Subject subject = SecurityUtils.getSubject();
(1) Code-Analyse: Builder-Muster verwenden, um Objekte zu erstellen:
1 //获取主题对象 2 public static Subject getSubject() {3     Subject subject = ThreadContext.getSubject();//第一次null4     if (subject == null) {5        subject = (new Subject.Builder()).buildSubject();6        ThreadContext.bind(subject);7         }8       return subject;9 }
(2) Verwenden Sie den Themenkontext, um ein Thema zu erstellen

(3) Erstellen Sie ein Subjektobjekt durch ein Thema
 1 public static class Builder{ 2        SubjectContext subjectContext; 3        SecurityManager securityManager; 4         public Builder(SecurityManager securityManager) { 5             if (securityManager == null) { 6                 throw new NullPointerException("SecurityManager method argument cannot be null."); 7             } 8             this.securityManager = securityManager; 9             this.subjectContext = newSubjectContextInstance();//DefaultSubjectContext(初始化一个backMap集合)10             if (this.subjectContext == null) {11                 throw new IllegalStateException("Subject instance returned from 'newSubjectContextInstance' " +12                         "cannot be null.");13             }14             this.subjectContext.setSecurityManager(securityManager);15         }16        public Subject buildSubject() {17             return this.securityManager.createSubject(this.subjectContext);18         }19 }

 

(4)DefaultSubjectFactory创建主题对象:
 1    public Subject createSubject(SubjectContext context) { 2         SecurityManager securityManager = context.resolveSecurityManager(); 3         Session session = context.resolveSession(); 4         boolean sessionCreationEnabled = context.isSessionCreationEnabled(); 5         PrincipalCollection principals = context.resolvePrincipals(); 6         boolean authenticated = context.resolveAuthenticated(); 7         String host = context.resolveHost(); 8 9         return new DelegatingSubject(principals, authenticated, host, session, sessionCreationEnabled, securityManager);10     }

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den Shiro-Quellcode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn