Shiro权限框架

       前言

        Apache Shiro 是 Java 的一个安全框架。目前,使用 Shiro 的人越来越多,因为它相当简单,对比Spring Security,可能没有 Spring Security 做的功能强大,但是在很多项目的实际开发中可能并不需要那么复杂的东西,所以使用小而简单的 Shiro 就足够了。


Shiro概念

        如果需要使用Shiro框架需要配置相应的Shiro 可以非常容易的开发出足够好的应用,Shiro的应用不依赖任何容器,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web集成、缓存等,是一个比较完备的安全框架,而且 Shiro 的 API 也非常简单。

upload successful

  • 术语和 Shiro 概念模型

    upload successful

    • Authentication:认证/登录,检查用户是否有相应的身份。
    • Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限,判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限。
    • Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的。
  • Shiro架构使用流程

    upload

    • Subject:主体,代表了当前 “用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;即一个抽象概念;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把Subject 认为是一个门面;SecurityManager 才是实际的执行者;
    • SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;

    • Realm:域,Shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户数据进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限数据进行验证用户是否能进行操作。因此,可以通俗地把 Realm 看成 DataSource,即安全数据源。Realm 的实现方式可以有很多种,比如 JDBC、ini 文件、LDAP 或者内存实现。

归纳起来,对于我们而言,最简单的一个 Shiro 应用,上述几个对象的分工大概是:应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;开发者需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法的用户及其权限进行判断。从以上也可以看出,Shiro 不提供维护用户 / 权限,而是通过 Realm 让
开发者自己注入。

upload successful

  • Shiro几个重要对象

    • Authenticator:认证器,负责主体认证的,这是一个扩展点,如果用户觉得 Shiro 默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了。
    • Authrizer:授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能。
    • CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能。
    • Cryptography:密码模块,Shiro 提高了一些常见的加密组件用于如密码加密 / 解密。

Shiro的使用

        如果需要使用Shiro框架需要引入一些对应的依赖和配置相应的组件。而对应不同的框架或者是不同的模板引擎需要引入不同的Shiro依赖

  • SpringBoot和thymeleaf模板技术引入Shiro核心依赖

     <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>com.github.theborakompanioni</groupId>
        <artifactId>thymeleaf-extras-shiro</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
        <version>1.9.22</version>
    </dependency>
  • Shiro依赖文件

upload successful

//引入thymeleaf-extras-shiro依赖后,页面上引入可以在页面
   进行shiro的属性设置,判断权限显示等。
   <html lang="zh_CN" xmlns:th="http://www.thymeleaf.org"
     xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">

根据不同模板和框架导入不同依赖,以下是Spring框架整合Shiro的依赖

upload successful

  • 认证/授权 - 示例

    • SpringBoot + MyBatis-plus + Shiro

      upload successful

      基本的布局,用户登录Controller -> Shiro(Realm) -> Service -> Dao

    • 登录LoginController

      upload successful

    • 自定义Realm(域)

      upload successful

    • 自定义Config

      upload successful

    • html页面

    upload successful
    upload successful