Shiro(二)简介

90 阅读3分钟

接上文讲到了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

image.png 也就是说对于我们而言,最简单的一个 Shiro 应用:

  1. 应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;
  2. 我们需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法的用户及其权限进行判断。

从以上也可以看出,Shiro 不提供维护用户 / 权限,而是通过 Realm 让开发人员自己注入。

subject -> SecurityManager -> Reaml

到此 Shiro 架构及其组件就认识完了,有了前面的知识不点,下一讲讲shiro的架构