认证流程如下:
1、首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必
须通过SecurityUtils. setSecurityManager()设置;
2、SecurityManager负责真正的身份验证逻辑;它会委托给Authenticator进行身份验证;
3、Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自
定义插入自己的实现;
4、Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认
ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证;
5、Authenticator 会把相应的token 传入Realm,从Realm 获取身份验证信息,如果没有返
回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进
行访问。
1. 开发者负责收集用户身份/凭证,并触发login。 2. 开发者负责实现Realm,用于获取用户认证数据。 3. shiro负责处理认证逻辑:判断Realm用户数据和用户输入数据是否匹配。
Shiro默认提供的Realm
授权流程如下:
1、首先调用Subject.isPermitted*/hasRole接口,其会委托给SecurityManager,而
SecurityManager接着会委托给Authorizer;
2、Authorizer是真正的授权者,如果我们调用如isPermitted(“user:view”),其首先会通过
PermissionResolver把字符串转换成相应的Permission实例;
3、在进行授权之前,其会调用相应的Realm获取Subject相应的角色/权限用于匹配传入的
角色/权限;
4、Authorizer会判断Realm的角色/权限是否和传入的匹配,如果有多个Realm,会委托给
ModularRealmAuthorizer 进行循环判断,如果匹配如isPermitted/hasRole*会返回true,否
则返回false表示授权失败。
1. 开发者负责实现资源验证授权数据。存在3种如下图 2. 运营者负责配置用户授权数据。 3. 开发者负责实现Realm,用于获取用户授权数据。 4. shiro负责处理授权逻辑:判断Realm用户授权数据和资源授权数据是否匹配。Spring集成
-
shiro-Filter
Shiro的ProxiedFilterChain执行流程:1、先执行Shiro自己的Filter链;2、再执行Servlet容器的Filter链(即原始的Filter)。Filter链是随url变化的。 构造DefaultFilterChainManager:基于filters和filterChainDefinitions生成:每个url的Filter链,每个Filter匹配url集合。 不直接将FilterChainManager对象暴露给AbstractShiroFilter的实现者,在这里就是SpringShiroFilter。 AbstractShiroFilter的doFilterInternal()方法:FilterChainResolver.getChain:当匹配到第一个url规则,则return一个代表这个url规则的FilterChain给web容器执行。 PathMatchingFilterChainResolver最重要的作用是:当请求url来的时候,他担任匹配工作。FilterChain是动态生成的。FilterChain通常是一两个Filter组成的。 Filter链 会将Filter链的Filter的doFilter方法顺序执行一遍。
-
Filter类系->默认拦截器->自定义Filter
默认Filter 基于表单的拦截器authc:前后端完全分离(由前端重定向)的情况通过异常返回表示。 没有登录默会跳转到登录页面 loginUrl doGet 登录失败默会跳转到登录页面 loginUrl doPost 登录成功 successUrl doGet login logout处理的2种方式 自调用:/login=anon;/logout=anon。subject.login(token);subject.login(token) 交给拦截器:/login = authc;/logout = logout
Session
SessionManager为所有Subject提供Session的管理,包括创建,删除,失效及验证等。
Shiro 提供的会话可以用于JavaSE/JavaEE 环境,不依赖于任何底层容器
Shiro 提供了三个默认实现:
DefaultSessionManager:DefaultSecurityManager使用的默认实现,用于JavaSE 环境;
ServletContainerSessionManager:用于Web环境,使用Servlet 容器的会话;
DefaultWebSessionManager : 用于Web环境, 废弃了Servlet容器的会话管理。
步骤
securityManager.sessionManager
sessionManager.sessionIdCookie
sessionIdCookie是sessionManager创建会话Cookie的模板。
sessionManager.sessionDAO:sessionManager创建session后交给sessionDAO,但id由sessionDAO生成,类似数据库自动主键。
会话监听器
SessionDAO 能够通过该接口来与你想要的任何数据存储进行通信。
SessionDAO用于会话的CRUD,即DAO(Data Access Object)模式实现。
EHCache SessionDAO 将会在内存中保存会话,并支持若内存不足时可溢出到磁盘。
EnterpriseCacheSessionDAO 实现CacheManagerAware 接口自动注入到CacheManager。可自定义SessionDAO不使用CacheManager。
sessionDAO.sessionIdGenerator
sessionManager源码分析
public interface Session {会话信息:客户端相关
SessionManager体系:
public interface SessionManager { 启动会话+根据会话Key获取会话
ValidatingSessionManager 用于验资并过期会话接口
WebSessionManager又提供了如下接口是否使用Servlet容器的会话
Session Validation & Scheduling无效(过期或停止)的会话能够从会话数据存储中删除。
Default SessionValidationScheduler
缓存管理
缓存管理器 Shiro 本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现。 public interface Cache?SSL》SSO》OAuth2等等 实践?改造{ public interface CacheManager { public interface CacheManagerAware {用于注入CacheManager 关联认证授权与缓存管理器 DefaultSecurityManager会自动检测相应的对象(如Realm)是否实现了CacheManagerAware并自动注入CacheManager。 Shiro 提供了CachingRealm,其实现了CacheManagerAware接口,提供了缓存的一些基础实现; 另外AuthenticatingRealm及AuthorizingRealm分别提供了对AuthenticationInfo和AuthorizationInfo信息的缓存。 认证缓存默认关闭,授权缓存默认打开。可配置。
- 预定义角色:管理员、菜单管理员(开发者)
- 权限名称直接使用URL资源名称?
- 后端做权限控制采用动态:根据配置菜单的URL权限 验证用户权限是否包括该URL



