接上文讲到了Subject、SecurityManager、Realm 下面来详细介绍下
Subject
subject是Shiro框架中的认证入口,代表了当前 “用户”,他可以是一个用户、一个定时任务,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;即一个抽象概念;程序中所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;在程序中我们通常把 subject设置为CurrentUser(比较的片面)。
通过 subject我们可以获取到当前主体的一些详细信息,比如:principle、permission、role等等,subject中还提供了许多判断用户信息的方法
// 入口方法
void login(AuthenticationToken token) throws AuthenticationException;
// 判断是否认证通过
boolean isAuthenticated();
// RememberMe状态,默认 fasle
boolean isRemembered();
// 获取当前主体session
Session getSession();
// 退出登录
void logout();
// 多线程执行
void execute(Runnable runnable);
// 获取认证用户的主体信息
PrincipalCollection getPrincipals();
// 是否有某个权限
boolean isPermitted(String permission);
boolean isPermitted(Permission permission);
// 是否有多个个权限
boolean[] isPermitted(String... permissions);
boolean[] isPermitted(List<Permission> permissions);
// 是否有所有权限权限
boolean isPermittedAll(String... permissions);
// 检查是否有某个权限
void checkPermission(String permission) throws AuthorizationException;
void checkPermissions(String... permissions) throws AuthorizationException;
// 是否有某个角色
boolean hasRole(String roleIdentifier);
// 是否有所有权限
boolean hasAllRoles(Collection<String> roleIdentifiers);
// 检查是否有某个角色
void checkRole(String roleIdentifier) throws AuthorizationException;
void checkRoles(Collection<String> roleIdentifiers) throws AuthorizationException;
SecurityManager
安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;使用时需要通过配置文件或者配置类进行配置
// 1.构建SecurityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(simpleAccountRealm);
// 2.主体提交认证请求
SecurityUtils.setSecurityManager(defaultSecurityManager); // 设置SecurityManager环境
或者是
@Bean
public SecurityManager securityManager(Realm realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm);
return securityManager;
}
等等还有其他的配置方式在这里就不一一列举。
Reaml
Realm:域,Shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。
在使用的时候需要我们自定义Realm,通常会继承AuthorizingRealm
也就是说对于我们而言,最简单的一个 Shiro 应用:
- 应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;
- 我们需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法的用户及其权限进行判断。
从以上也可以看出,Shiro 不提供维护用户 / 权限,而是通过 Realm 让开发人员自己注入。
subject -> SecurityManager -> Reaml
到此 Shiro 架构及其组件就认识完了,有了前面的知识不点,下一讲讲shiro的架构