shiro关键组件
SecurityManager
org.apache.shiro.mgt.SecurityManager shiro核心接口,负责一个Subject全部安全操作
接口本身定义了login、logout、createSubject三个方法控制用户创建登录和退出
扩展了org.apache.shiro.authc.Authenticator。该接口提供了authenticate方法用来认证
扩展了org.apache.shiro.authz.Authorizer。该接口提供了对Permission和Role的校验方法
扩展了org.apache.shiro.session.mgt。该接口提供了start、getSession方法来创建获取会话
shiro为SecurityManager提供了了一个包含上述功能的实现类DefaultSecurityManager
subjectFactory:默认使用DefaultSubjectFactory,用来创建具体Subject实现类
subjectDAO:默认使用DefaultSubjectDAO,用来将最近subject中信息保存到Session中
rememberMeManager:提供记住我功能
DefaultSecurityManager有一个子类 DefaultWebSecurityManager,这个类在shiro-web包中。这个类默认创建配置了org.apache.shiro.web.mgt.CookieRememberManager,用来提供记住我相关功能。
Subject
org.apache.shiro.subject.Subject是一个接口,表示Shiro中的一个用户
Subject接口同样提供了认证、授权和获取回话的能力,在应用程序中要获取一个当前的Subject,使用SecurityUtils.getSubject()即可。
只从功能上看似乎Subject和SecurityManager差不多,实际上Subject接口的实现类org.apache.shiro.subject.support.DelegatingSubject本质上就是一个SecurityManager的代理类。
DelegatingSubject中保存了一个transient修饰的SecurityManager成员变量。使用具体校验方法时实际上交给SecurityManager处理。DelegatingSubject中不保存和维持用户的状态,每次依赖底层的SecurityManager来校验,因此一般SecurityManager的实现类都提供一些缓存机制。
Realm
org.apache.shiro.realm.Realm是shiro中的一个接口,shiro通过Realm来访问指定应用的安全实体(用户 角色 权限等)。一个Realm通常与一个数据源有一对一的关系,比如关系型数据库、文件系统等。
所以此接口的实现类将使用特定于数据源的API来进行认证或授权,比如JDBC、文件IO等。官方解释:特定于安全的DAO层。
使用中研发通常不会直接实现Realm接口,而是实现 shiro提供了一些相关功能的 抽象类,如AuthenticatingRealm/AuthorizingRealm;或者使用针对特定数据源提供的实现类,如JndiLdapRealm/JdbcRealm/PropertiesRealm/TextConfigurationRealm/IniRealm等
认证和授权校验流程
通过上面组件的了解,总结流程
应用程序获取当前的Subject(用户),调用相应校验方法
Subject将校验委托给SecurityManager进行判断
SecurityManager调用Realm获取信息判断用户对应用户的角色能否操作
Shiro550
影响版本:1.x < 1.2.5
待续/