>  기사  >  Java  >  Shiro 소스 코드의 자세한 소개

Shiro 소스 코드의 자세한 소개

零下一度
零下一度원래의
2017-07-26 16:36:441934검색
(1)//1. SecurityManager 팩토리를 가져오고 여기에서 Ini 구성 파일을 사용하여 SecurityManager
Factory 팩토리 = new IniSecurityManagerFactory("classpath:shiro.ini")
2. 팩토리 클래스 클래스 구조는 다음과 같습니다.

(3) abstractFactory 클래스는 주로 싱글톤인지 여부를 설정합니다.

(4) iniFactorySupport는 ini 설정을 지원하여 생성된 객체입니다.

(5) iniSecurityman agerFactory는 securityManager

(2)//2의 구현 클래스를 생성하는 ini 메소드입니다. SecurityManager 인스턴스를 가져와 SecurityUtils
org.apache.shiro.mgt.SecurityManagersecurityManager에 바인딩합니다. = Factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
(1) 생성된 Ini 객체를 통해 Securitymanager 객체를 생성합니다.
1  IniSecurityManagerFactory类:2      creatSecuritymanager(ini){3      SecurityManager securityManager = createSecurityManager(ini);4      return securityManager;5  }

(2) 다음을 통해 Securitymanager 객체를 생성합니다. 생성된 Ini 객체
 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  }

( 3) ini 객체와 메인 모듈 mainSession을 통해 Securitymanager를 생성합니다.

 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) IniRealm은 초기화 가능을 구현하므로 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 }
IniRealm의 클래스 구조는 다음과 같습니다.
계정은

이 시점에서 Object Association을 생성하면 IniRealm 초기화가 완료됩니다! 다음으로 DefaultSecurityManager의 구조 다이어그램을 살펴보세요.
(7) DefaultSecurityManager의 영역 속성을 설정합니다.
 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 }
참고: afterRealmsSet()은 주로 영역 속성을 설정하는 데 사용됩니다. 인증자 및 권한 부여자:
이 시점에서 DefaultSecurityManager의 속성이 설정되고 DefaultSecurityManager 개체가 반환됩니다

///3. 제목을 가져오고 사용자 이름/비밀번호 인증 토큰(예: user ID/자격 증명)

Subject subject = SecurityUtils.getSubject();
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 }
(1) 코드 분석: 빌더 패턴을 사용하여 객체 생성:rr 리 (2) 테마 컨텍스트를 사용하여 테마 생성
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 }
(3) 테마를 통해 주제 객체 생성

 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     }

위 내용은 Shiro 소스 코드의 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Eclipse 작업 요약다음 기사:Eclipse 작업 요약