Springboot整合shiro权限框架实现前后端分离
in 后端 with 0 comment

Springboot整合shiro权限框架实现前后端分离

in 后端 with 0 comment

最近做项目涉及到权限控制,第一次接触shiro框架,结合网上教程爬了两天的坑大致上是弄懂了。
对于权限模块的设计思路,一般都是基于角色的访问控制(RBAC),但在GitHub上看到个RBAC新解,按照这种思路可以很容易做到接口级别的权限控制。

本质上就是接口只校验权限,而非校验角色,在登陆的时候查询出用户的角色,并将该角色拥有的所有权限存入一个列表,当访问/user/add接口时,只需要看权限列表是否有user:add权限即可。

说明

可以前往上面提到的GitHub中下载测试,本文也是参考该项目搭建的。

数据库

可点击下载:sql文件,权限相关只有4个表,大致说明下:

常规的RBAC最少需要5张表,这里简单起见设定为一个用户仅有一种权限,若要做多角色用户则需要额外新增一张用户 - 角色关联表。

前端

可以通过数据库查询权限集合与菜单集合,返回给前端类似于这样的数据,前端可以根据menuList决定展示哪些菜单,根据permissionList控制按钮是否可操作。权限的格式为表:操作,例如article:add就代表拥有新增文章的权限。

 "data":{  
         "menuList":[  
            "role",
            "user",
            "article"
         ],
         "permissionList":[  
            "article:list",
            "article:add",
            "user:list",
         ]
      }

后端

1、maven依赖
这里用到了一个shiro-redis工具:GitHub链接,有相关文档可以自己看看。其他还需要shiro依赖、web依赖和redis依赖。

        <!-- shiro权限 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.6.0</version>
        </dependency>
        <!-- shiro的redis工具 -->
        <dependency>
            <groupId>org.crazycake</groupId>
            <artifactId>shiro-redis</artifactId>
            <version>3.2.3</version>
        </dependency>
        <!-- WEB支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Redis支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2、yml配置
shiro这块可以完全在Configuration类里配置,所以yml里面主要是放redis的配置信息,这里正常配置redis参数。

spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:     # 密码(默认为空)
    timeout: 6000  # 连接超时时长(毫秒)
    jedis:
      pool:
        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
        max-wait: -1      # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 10      # 连接池中的最大空闲连接
        min-idle: 5      # 连接池中的最小空闲连接

3、累了下次再写

Responses