在 Web 环境下,主要的 Subject 实现类是 WebDelegatingSubject
Session
通过调用 Subject#getSession() 方法进行懒加载调用。
如果使用的是 DefaultWebSecurityManager,则通过将 HttpSession 封装到 shiro 的 HttpServletSession 中。
- 关闭 shiro session 存储
在 DefaultSubjectDAO 中的 save() 方法,如果关闭了 shiro session 存储,则不会将 2 个属性(principals、authenticationState)存储到 session
Shiro 过滤器AnonymousFilter(anon)
匿名过滤器,请求直接通过。
public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
}
AuthenticationFilter
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
return subject.isAuthenticated();
}
AuthenticatingFilter
如果 subject 进行了认证,或者这是除了 loginUrl 之外的放行 url,则允许访问;否则,不允许。
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
return super.isAccessAllowed(request, response, mappedValue) ||
(!isLoginRequest(request, response) && isPermissive(mappedValue));
}
FormAuthenticationFilter
枚举名称 authc
该过滤器是 shiro-spring 包 ShiroWebConfiguration 中 shiroFilterChainDefinition 唯一注册的一个过滤器。
onAccessDenied 方法分 loginUrl 处理和非 loginUrl 处理:
- 当请求是 loginUrl 时,其中又根据是否为 POST 请求判断是否是 login 页面请求还是,login 提交。
- 当请求是非 loginUrl 时,向 session 存储了一个属性 shiroSavedRequest, 然后跳转到登录页面。
onAccessDenied 逻辑:
- 通过请求头 Authorization 判断是否为 login 请求,如果是,执行 executeLogin 逻辑,获取 username, password 构造 AuthenticationToken 进行 Realm 认证。
- 如果不是 login 请求,或者登录失败,发送质询
Spring Shiro
ShiroFilterFactoryBean#createInstance
- securityManager 必须非 null,而且为 WebSecurityManager 实例
- createFilterChainManager(),其中包括创建默认的过滤器
默认的过滤器由 DefaultFilterChainManager 管理,在构造器 addDefaultFilters() 调用
默认过滤器见枚举 DefaultFilter



