Maison  >  Article  >  Java  >  Introduction détaillée du code source de Shiro

Introduction détaillée du code source de Shiro

零下一度
零下一度original
2017-07-26 16:36:441872parcourir

" classpath:shiro.ini")

2. La structure de classe de la classe d'usine est :
(3) La classe abstractFactory définit principalement s'il s'agit d'un singleton
(4) iniFactorySupport est un objet créé en prenant en charge les paramètres ini

(5) iniSecuritymanagerFactory est la classe d'implémentation pour créer securityManager en mode ini

(2)
//2 Obtenez l'instance SecurityManager. et liez-le à SecurityUtils

org.apache.shiro.mgt.SecurityManagersecurityManager = factory.getInstance();SecurityUtils. setSecurityManager(securityManager);
(1) Créer un objet Securitymanager via l'objet Ini créé
(2) Via l'objet Ini créé Créer un objet Securitymanager
1  IniSecurityManagerFactory类:2      creatSecuritymanager(ini){3      SecurityManager securityManager = createSecurityManager(ini);4      return securityManager;5  }

(3) Créer Securitymanager
 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) Définir l'association entre les objets via mainSession et l'objet objet par défaut

 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) Étant donné qu'IniRealm implémente Initialisable, initialisez l'objet IniRealm
 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 }
La structure de classe d'IniRealm est :
 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 }
La structure de simpleAccount est :


À ce stade, l'association d'objets est créée et l'initialisation d'IniRealm est terminée ! Ensuite, regardez le diagramme de structure de DefaultSecurityManager :
(7) Définissez l'attribut de domaine de DefaultSecurityManager :
Remarque :
afterRealmsSet(); est principalement utilisé pour définir les attributs de domaine de l'authentificateur et de l'autorisateur :
Jusqu'à présent, DefaultSecurityManager Le paramétrage de la propriété est terminé et l'objet DefaultSecurityManager est renvoyé
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. Obtenez le sujet et créez le jeton d'authentification du nom d'utilisateur/mot de passe (c'est-à-dire l'identité de l'utilisateur). /credential)

Sujet sujet = SecurityUtils.getSubject();
(1) Analyse du code : utiliser un modèle de générateur pour créer des objets :
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) Utiliser le contexte du thème pour créer un thème

(3) Créer un objet sujet via le thème
 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     }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn