shiro源码分析

CachingEnabled单独设置有效
setAuthenticationCachingEnabled或者setAuthorizationCachingEnabled会将CachingEnabled重置为true

    public void setAuthenticationCachingEnabled(boolean authenticationCachingEnabled) {
        this.authenticationCachingEnabled = authenticationCachingEnabled;
        if (authenticationCachingEnabled) {
            this.setCachingEnabled(true);
        }
    }

  认证流程分析

1.DelegatingSubject调用login
2.DefaultSecurityManager调用login
3.AuthenticatingSecurityManager调用authenticate
4.AbstractAuthenticator调用authenticate
5.ModularRealmAuthenticator调用doAuthenticate这里分为Single和Multi,具体算法可以debug仔细看
6.单Realm情况下调用ModularRealmAuthenticator.doSingleRealmAuthentication
7.AuthenticatingRealm调用getAuthenticationInfo 如果设置里缓存这里会从缓存读数据和储存缓存

    public final AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        AuthenticationInfo info = this.getCachedAuthenticationInfo(token);
        if (info == null) {
            info = this.doGetAuthenticationInfo(token); //读取缓存
            log.debug("Looked up AuthenticationInfo [{}] from doGetAuthenticationInfo", info);
            if (token != null && info != null) {
                this.cacheAuthenticationInfoIfPossible(token, info); //保存缓存
            }
        } else {
            log.debug("Using cached authentication info [{}] to perform credentials matching.", info);
        }

        if (info != null) {
            this.assertCredentialsMatch(token, info);
        } else {
            log.debug("No AuthenticationInfo found for submitted AuthenticationToken [{}].  Returning null.", token);
        }

        return info;
    }

  

    private AuthenticationInfo getCachedAuthenticationInfo(AuthenticationToken token) {
        AuthenticationInfo info = null;
        Cache<Object, AuthenticationInfo> cache = this.getAvailableAuthenticationCache(); 
        if (cache != null && token != null) {
            log.trace("Attempting to retrieve the AuthenticationInfo from cache.");
            Object key = this.getAuthenticationCacheKey(token);  //key用户名
            info = (AuthenticationInfo)cache.get(key);   //info凭证
            if (info == null) { 
                log.trace("No AuthorizationInfo found in cache for key [{}]", key);
            } else {
                log.trace("Found cached AuthorizationInfo for key [{}]", key);
            }
        }

        return info;
    }

  

AuthenticatingRealm调用cacheAuthenticationInfoIfPossible设置缓存
    private void cacheAuthenticationInfoIfPossible(AuthenticationToken token, AuthenticationInfo info) {
        if (!this.isAuthenticationCachingEnabled(token, info)) { //判断有没有开启缓存设置
            log.debug("AuthenticationInfo caching is disabled for info [{}].  Submitted token: [{}].", info, token);
        } else {
            Cache<Object, AuthenticationInfo> cache = this.getAvailableAuthenticationCache();
            if (cache != null) {
                Object key = this.getAuthenticationCacheKey(token);
                cache.put(key, info);
                log.trace("Cached AuthenticationInfo for continued authentication.  key=[{}], value=[{}].", key, info);
            }

        }
    }

  

 

posted @ 2018-09-12 10:34  cshhs  阅读(417)  评论(0编辑  收藏  举报