Heim > Java > javaLernprogramm > Hauptteil

Detaillierte Einführung in den Shiro-Quellcode

零下一度
Freigeben: 2017-07-26 16:36:44
Original
1945 Leute haben es durchsucht

" 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  }
Nach dem Login kopieren

(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  }
Nach dem Login kopieren

(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     }
Nach dem Login kopieren
(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 }
Nach dem Login kopieren
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 }
Nach dem Login kopieren
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 }
Nach dem Login kopieren

//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 }
Nach dem Login kopieren
(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 }
Nach dem Login kopieren

 

(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     }
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage