1,程序调用subject.login(token)方法,同时传入存有用户信息的token实例(包括Principals(身份)和Credentials(凭证));
2,subject的实现类DelegatingSubject通过login方法委托给securityManagerde 的login方法进行真正的认证;
3,SubjectManager(这里我用的是org.apache.shiro.web.mgt.DefaultWebSecurityManager)接收token 以及简单地委托给内部的Authenticator 实例通过调用authenticator.authenticate(token)。这通常是一个ModularRealmAuthenticator 实例,支持在身份验证中协调一个或多个Realm 实例;
4,ModularRealmAuthenticator将会调用doAuthenticate()来执行一个realm或者一个以上的realm,如果是单个realm的话,会调用doSingleRealmAuthentication()方法来执行realm(一般是AuthorizingRealm)中的getAuthenticationInfo()方法,同时getAuthenticationInfo()方法会继续调用我们自定义的realm中的复写方法doGetAuthenticationInfo()方法。