shiro
SecurityManager,安全管理器,是一个接口,它继承了Authenticator, Authorizer, SessionManager;
Subject, 代表一个用户,是一个接口;
SecurityUtils,工具类,是一个抽象类;
要使用shiro,先获取SecurityManager的实例(一般是DefaultSecurityManager),
把SecurityManager的实例交给SecurityUtils保管,
然后通过SecurityUtils获取一个Subject(一般是DelegatingSubject)的实例,
通过Subject实例的login(Token)进行登录,
后续操作都是通过Subject实例的方法进行。
-------------------------------------------------------------------------
关于登录:
即:subject.login(AuthenticationToken实例)。
DelegatingSubject.login(token)内部,是由DelegatingSubject内的SecurityManager的实例login方法进行的登录,
DefaultSecurityManager.login(subject,token)内部,由DefaultSecurityManager内部的Authenticator的authenticate(token)进行认证,
AbstractAuthenticator.authenticate(token)内部主要由抽象方法doAuthenticate(token)进行认证,
抽象的AbstractAuthenticator在执行authenticate(token)时doAuthenticate(token)方法这一步,doAuthenticate由其子类实现,
具体doAuthenticate的执行是由AbstractAuthenticator的子类ModularRealmAuthenticator的doAuthenticate。
在ModularRealmAuthenticator的doAuthenticate执行的时候,会判断当前是单realm,还是多realm环境,从而进行对应的认证操作。
在单realm认证的时候由realm的抽象类AuthenticatingRealm的getAuthenticationInfo(token)来进行认证,
realm.getAuthenticationInfo(token)内部会尝试从缓存中获取用户的认证结果并返回,
如果缓冲里面没有认证结果,就执行抽象类AuthenticatingRealm的抽象方法doGetAuthenticationInfo(token)进行认证,
然后具体就是抽象类AuthenticatingRealm子类SimpleAccountRealm的doGetAuthenticationInfo(token)实现完成最最最最终的认证。
认证的结果就是返回AuthenticationInfo,这个里面包含了用户的信息。
小总结:
实际编码时候,都是先获得SecurityManager的实例,然后通过Subject的实例进行一顿操作。
然鹅,subject的操作会交给securityManager,
securityManger又会把操作交给Authenticator(先是抽象的AbstractAuthenticator进行了一顿统一的操作,然后交由具体的ModularAuthenticator进行了又一顿的操作),
Authenticatory又会把操作交给realm(先是抽象的AuthenticatingRealm进行了一顿统一的操作,然后交由具体的SimpleAccountRealm(或其他)进行了又一顿的操作),
这是候,才操作出了一点小成果,小成果就是登录的结果AuthenticationInfo。
再这里看到了shiro的一点点套路,爱玩抽象类进行统一操作,然后具体的操作由子类来实现。
20191212