Maison > Java > javaDidacticiel > le corps du texte

Introduction détaillée du code source de Shiro

零下一度
Libérer: 2017-07-26 16:36:44
original
1934 Les gens l'ont consulté

" 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  }
Copier après la connexion

(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  }
Copier après la connexion

(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     }
Copier après la connexion
(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 }
Copier après la connexion
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 }
Copier après la connexion
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 }
Copier après la connexion

//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 }
Copier après la connexion
(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 }
Copier après la connexion

 

(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     }
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!