shiro提供3个默认sessionManager:DefaultSessionManager,ServelteContainerManager,DefaultWebSessionManager,
ServeltContainerManager是使用servlet容器的回话,以及servlet容器管理,DefaultSessionManager是DefaultSecurityManger使用
的默认实现,DefualtWebSessionManger用于web环境,可替换ServletContainerManger.
DefaultSessionManger中的SessionDAO用于session persistence,如果不设置,默认的是MemeorySessionDAO(ConcurrentHashMap),用内存持久化session,
shiro提供了带缓存的SessionDAO EnterpriseCacheSessionDAO(CachingSessionDAO curdDAO),
shiro session创建过程:
不使用servlet容器管理session,使用sessionManager管理session,所以sessionManager start最终调用defaultSessionManager
的doCreateSession方法,调用create方法,进一步调用sessionDAO.create,如果没有强制制定sessionDAO,默认的使用MemeorySessionDAO
doCreate生成session,将session存储到内存中,如果配置sessionDAO为EnterpriseCacheSessionDAO,则会调用CachingSessionDAO.create,
在调用super.create,最终调用EnterpriseCacheSessionDAO.docreate方法生成session,CacheingSessionDAO在调用create之后会将session存储到
缓存中sessinId为key,session为value。
SessionManager.getSession获取session,会调用DefaultSessionManager.retrieveSession,如果使用了CachingSessionDAO的话,会
先从缓存中获取session,不存在的话再调用SessionDAO.readSession读取session
shiro缓存信息:
在设置DefaultWebSecurityManager的cacheManager时,其实是将cacheManager设置到CachingSecurityManager中的,调用setCacheManager
设置之后还会afterCacheManager,回调方式去设置其他组件的cacheManager,在RealmSecurityManager重写CachingSecurityManager的afterCacheManagerSet
方法,会将cacheManager设置给所有实现CacheManagerAware接口的realm(比如我们在DefaultWebSecurityManager中设置的realm,同时在securityManager
setRealm和setCacheManager方法之后都会调用applyCacheManagerToRealm),在AuthenticatingRealm和AuthorizingRealm中都都有Cache和cacheName,都
是用来缓存认证信息和权限信息的,subject.login(Authentication token)进行用户登录时,其实会委托SecurityManager进行login最终还是Authenticator
去进行身份验证,shiro默认使用的Authenticator为ModularRealmAuthenticatior,如果是single realm则进行doSingleRealmAuthentication,realm>1则
doMultiRealmAuthentication,single realm的话在doSingleRealmAuthentication中调用realm.getAuthenticationInfo(token),首先会从缓存中取,如果为
null 则调用AuthorizingRealm中deoGetAuthorizationInfo方法获取,AuthorizingRealm可继承后重写该方法,再从缓存中取AuthenticationInfo时,会先判断
是否有Cache存在以及是否认证换缓存可用(缓存AuthenticationInfo的key为token.getPrincipal,值为info),获取 AuthenticationInfo之后会调用
assertCredentialsMatch进行密码校验,到此认证结束。(如果未设置authenticationCache,但设置了cacheName,shiro会调用getAuthenticationCacheLazy
获取一个cache,但只有设置CachingRealm isCachingEnacled和authenticationCachingEnabled才会缓存认证信息,授权同理)
ServeltContainerManager是使用servlet容器的回话,以及servlet容器管理,DefaultSessionManager是DefaultSecurityManger使用
的默认实现,DefualtWebSessionManger用于web环境,可替换ServletContainerManger.
DefaultSessionManger中的SessionDAO用于session persistence,如果不设置,默认的是MemeorySessionDAO(ConcurrentHashMap),用内存持久化session,
shiro提供了带缓存的SessionDAO EnterpriseCacheSessionDAO(CachingSessionDAO curdDAO),
shiro session创建过程:
不使用servlet容器管理session,使用sessionManager管理session,所以sessionManager start最终调用defaultSessionManager
的doCreateSession方法,调用create方法,进一步调用sessionDAO.create,如果没有强制制定sessionDAO,默认的使用MemeorySessionDAO
doCreate生成session,将session存储到内存中,如果配置sessionDAO为EnterpriseCacheSessionDAO,则会调用CachingSessionDAO.create,
在调用super.create,最终调用EnterpriseCacheSessionDAO.docreate方法生成session,CacheingSessionDAO在调用create之后会将session存储到
缓存中sessinId为key,session为value。
SessionManager.getSession获取session,会调用DefaultSessionManager.retrieveSession,如果使用了CachingSessionDAO的话,会
先从缓存中获取session,不存在的话再调用SessionDAO.readSession读取session
shiro缓存信息:
在设置DefaultWebSecurityManager的cacheManager时,其实是将cacheManager设置到CachingSecurityManager中的,调用setCacheManager
设置之后还会afterCacheManager,回调方式去设置其他组件的cacheManager,在RealmSecurityManager重写CachingSecurityManager的afterCacheManagerSet
方法,会将cacheManager设置给所有实现CacheManagerAware接口的realm(比如我们在DefaultWebSecurityManager中设置的realm,同时在securityManager
setRealm和setCacheManager方法之后都会调用applyCacheManagerToRealm),在AuthenticatingRealm和AuthorizingRealm中都都有Cache和cacheName,都
是用来缓存认证信息和权限信息的,subject.login(Authentication token)进行用户登录时,其实会委托SecurityManager进行login最终还是Authenticator
去进行身份验证,shiro默认使用的Authenticator为ModularRealmAuthenticatior,如果是single realm则进行doSingleRealmAuthentication,realm>1则
doMultiRealmAuthentication,single realm的话在doSingleRealmAuthentication中调用realm.getAuthenticationInfo(token),首先会从缓存中取,如果为
null 则调用AuthorizingRealm中deoGetAuthorizationInfo方法获取,AuthorizingRealm可继承后重写该方法,再从缓存中取AuthenticationInfo时,会先判断
是否有Cache存在以及是否认证换缓存可用(缓存AuthenticationInfo的key为token.getPrincipal,值为info),获取 AuthenticationInfo之后会调用
assertCredentialsMatch进行密码校验,到此认证结束。(如果未设置authenticationCache,但设置了cacheName,shiro会调用getAuthenticationCacheLazy
获取一个cache,但只有设置CachingRealm isCachingEnacled和authenticationCachingEnabled才会缓存认证信息,授权同理)