全网最简单的shiro教程第四节

Shiro认证流程分析以及源码介绍:

使用代码实现了Shiro认证流程,根据代码可以用一个简单的流程图将认证流程表达出来【这样就非常容易理解】
全网最简单的shiro教程第四节

一顿操作猛如虎,,,,,,

为何调用了login方法最后会调用Realm的doGetAuthenticationInfo操作呢?
接下来咱们就去看源码怎么关联的:

全网最简单的shiro教程第四节

点进去看实现类:

全网最简单的shiro教程第四节
接着往下点:

全网最简单的shiro教程第四节

点点点:

全网最简单的shiro教程第四节

点点点:
全网最简单的shiro教程第四节

点点点:

全网最简单的shiro教程第四节

点点点:
全网最简单的shiro教程第四节

最终调用的是:AuthenticationInfo info = realm.getAuthenticationInfo(token);【这里的Realm就是我们自定义的Realm】

总结一下调用流程:

Subject【login方法】
-->DelegatingSubject【login方法】
-->DefaultSecurityManager【securityManager.login(this, token);】
-->AuthenticatingSecurityManager【authenticate(AuthenticationToken token)】
-->AbstractAuthenticator【authenticate(AuthenticationToken token)】
-->ModularRealmAuthenticator【doAuthenticate(AuthenticationToken authenticationToken)】
-->ModularRealmAuthenticator【doSingleRealmAuthentication(Realm realm, AuthenticationToken token)】

AuthenticationInfo info = realm.getAuthenticationInfo(token);

以上就是subject.login方法的调用流程。

 

为何Realm和SecurityManager通过配置来关联?

shiro.ini中securityManager和自定义的Realm是怎么生效的呢?

接下来让我们继续点点点:

全网最简单的shiro教程第四节

点:
全网最简单的shiro教程第四节

 

调用流程:

IniSecurityManagerFactory【createSecurityManager(Ini ini, Ini.Section mainSection)】
->IniSecurityManagerFactory【buildInstances(Ini.Section section)】=>获取shiro.ini配置文件键值对
->IniSecurityManagerFactory【getRealms(Map<String, ?> instances)】=>通过前面的键值对获取Realm
->IniSecurityManagerFactory【applyRealmsToSecurityManager(Collection<Realm> realms, SecurityManager securityManager)】

Realm和SecurityManager关联源码就是以上截图。