shiro
一.认证
subject接受token,通过其实现类DelegatingSubject将token委托给SecurityManager来完成认证。SecurityManager是接口通过DefaultSecurityManager来完成相关功能。由DefaultSecurityManager中login来完成认证过程。在login中调用了该类authenticate()来完成认证。该方法是由AuthenticatingSecurityManager(DefaultSecurityManager是其子类)来完成的。在该类的authenticate()中,通过调用authenticator(认证器)来完成认证工作。Authenticator是由默认实现类ModularRealmAuthenticator来完成认证。通过ModularRealmAuthenticator中的doAuthenticate来获取realms信息。如果是单realm直接将token和realm中的数据进行比较,判断是否认证成功。如果是多realm那么需要通过AuthenticationStrategy(认证策略)来完成对应的认证工作。
AuthenticationStrategy(认证策略):默认
AtLeastOneSuccessfulStrategy 至少一条满足的情况
AllSuccessfulStrategy 所有都满足的情况
FirstSuccessfulStrategy 第一条满足的情况
二.授权
hasRole 返回Boolean
checkRole 报异常
isPermitted 返回Boolean
checkPermission 报异常
a)获取subject主体
b)判断主体是否通过认证
c)调用subject.isPermitted*/hasRole*来进行权限的判断
i.Subject是由其实现类DelegatingSubject来调用方法的,该类将处理交给了securityManager
ii.security是由其实现类DefaultSecurityManager来进行处理的,该类的isPermitted()来处理,其本质是父类AuthorizingSecurityManager(DefaultSecurityManager是其子类)的isPermitted方法(DefaultSecurityManager没有重写该方法)来处理。该方法将处理交给authorizer(授权器)来处理
iii.Authotizer由其实现类ModularRealmAuthorizer来处理,在该类有PermissioniResolver对权限字符串(页面传过来的权限信息)进行解析。该类可以调用对应的Realm来获取数据(权限信息,如从数据库获取),在Realm中也有对应的PermissionResolver交给WildcardPermissionResolver,该类调用WildcardPermission来进行权限字符串的解析。
iv.返回处理结果