spring-boot-plus V1.4.0发布 集成用户角色权限部门管理(推荐)

RBAC用户角色权限

用户角色权限部门管理核心接口介绍

Shiro权限配置

👉 Shiro权限配置

数据库模型图

👉 spring-boot-plus初始化SQL下载

获取验证码

  • 可配置是否启用验证码
  • 默认未启用
  • 如已启用验证码校验,登陆时,需传入verifyToken和code

验证码演示

spring-boot-plus:
 # 是否启用ansi控制台输出有颜色的字体
 enable-ansi: true
 # 是否启用验证码
 enable-verify-code: true

enable-verify-code 设置为 true 启用验证码验证

两种方式获取验证码

验证码后台保存在Redis中,过期时间默认为5分钟

方式一:

输出图片流到浏览器,验证码token输出到响应头

http://localhost:8888/verificationCode/getImage

Response Headers
HTTP/1.1 200
verifyToken: 6515b4b798ce49e68b1e40f98ff8eb19

方式二:

获取Base64编码图片和验证码token

http://localhost:8888/verificationCode/getBase64Image

{
 "code": 200,
 "msg": "操作成功",
 "success": true,
 "data": {
 "image": "data:image/png;base64,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",
 "verifyToken": "42ba8abde7bc47b2b1397b4d6676956a"
 },
 "time": "2019-11-01 22:40:37"
}

系统用户登陆

POST请求,Content-Type: application/json

http://127.0.0.1:8888/login

请求参数

{
 "code": "验证码",
 "password": "123456",
 "username": "admin",
 "verifyToken": "验证码token"
}

注意

  • 如果没有启用验证码登陆,则只需传入usernamepassword
  • 前端应将密码加密后进行传输

登陆成功

  • 返回登陆用户信息:部门/角色/权限
  • 返回用户token
{
 "code": 200,
 "msg": "登陆成功",
 "success": true,
 "data": {
 "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJ3ZWIiLCJpc3MiOiJzcHJpbmctYm9vdC1wbHVzIiwiZXhwIjoxNTcyNjIzMDE5LCJpYXQiOjE1NzI2MTk0MTksImp0aSI6IjdlZmVlM2UwMjc2MTRiYTc5M2I2YmYwZmE4NTgzYmUwIiwidXNlcm5hbWUiOiJhZG1pbiJ9.O3w7CNRqw_Miwp8MDzPND6w490c9Q7yFlKpFJK9ubSU",
 "loginSysUserVo": {
  "id": "1",
  "username": "admin",
  "nickname": "管理员",
  "gender": 1,
  "state": 1,
  "departmentId": "1",
  "departmentName": "管理部",
  "roleId": "1",
  "roleName": "管理员",
  "roleCode": "admin",
  "permissionCodes": [
  "sys:permission:codes",
  "system:management",
  "sys:department:update",
  "sys:department:page",
  "sys:role:management",
  "sys:permission:add",
  "sys:user:add",
  "sys:role:page",
  "sys:permission:page",
  "sys:department:delete",
  "sys:permission:management",
  "sys:user:delete",
  "sys:department:management",
  "sys:user:page",
  "sys:user:update",
  "sys:user:update:password",
  "sys:user:update:head",
  "sys:role:add",
  "sys:permission:menu:tree",
  "sys:department:info",
  "sys:permission:all:menu:list",
  "sys:permission:info",
  "sys:role:info",
  "sys:permission:all:menu:tree",
  "sys:permission:update",
  "sys:permission:menu:list",
  "sys:role:update",
  "sys:user:info",
  "sys:user:management",
  "sys:role:delete",
  "sys:permission:delete"
  ]
 }
 },
 "time": "2019-11-01 22:43:39"
}
  • token默认失效时间为1个小时
  • 设置JWT Token失效时间
############################ JWT start #############################
 jwt:
 # 默认过期时间1小时,单位:秒
 expire-second: 3600
  • 后台使用Redis缓存登陆用户信息
  • redis key

login:user:admin

其它需要授权访问的接口,请求头需携带token

部门树形列表

部门可以设置为N级,后台使用递归将部门列表转换为树形列表

SysDepartmentServiceImpl

@Override
 public List<SysDepartmentTreeVo> getAllDepartmentTree() {
  List<SysDepartment> sysDepartmentList = getAllDepartmentList();
  if (CollectionUtils.isEmpty(sysDepartmentList)) {
   throw new IllegalArgumentException("SysDepartment列表不能为空");
  }
  List<SysDepartmentTreeVo> list = SysDepartmentConvert.INSTANCE.listToTreeVoList(sysDepartmentList);
  List<SysDepartmentTreeVo> treeVos = new ArrayList<>();
  for (SysDepartmentTreeVo treeVo : list) {
   if (treeVo.getParentId() == null) {
    treeVos.add(findChildren(treeVo, list));
   }
  }
  return treeVos;
 }

 /**
  * 递归获取树形结果列表
  *
  * @param tree
  * @param list
  * @return
  */
 public SysDepartmentTreeVo findChildren(SysDepartmentTreeVo tree, List<SysDepartmentTreeVo> list) {
  for (SysDepartmentTreeVo vo : list) {
   if (tree.getId().equals(vo.getParentId())) {
    if (tree.getChildren() == null) {
     tree.setChildren(new ArrayList<>());
    }
    tree.getChildren().add(findChildren(vo, list));
   }
  }
  return tree;
 }

前端JSON结构

http://127.0.0.1:8888/sysDepartment/getAllDepartmentTree

角色管理

设置角色权限

  • 核心代码,删除角色权限,新增角色权限
  • 求集合的差集
  • SysRolePermissionServiceImpl
@Transactional(rollbackFor = Exception.class)
 @Override
 public boolean updateSysRole(UpdateSysRoleParam updateSysRoleParam) throws Exception {
  Long roleId = updateSysRoleParam.getId();
  List<Long> permissionIds = updateSysRoleParam.getPermissionIds();
  // 校验角色是否存在
  SysRole sysRole = getById(roleId);
  if (sysRole == null) {
   throw new BusinessException("该角色不存在");
  }
  // 校验权限列表是否存在
  if (!sysPermissionService.isExistsByPermissionIds(permissionIds)) {
   throw new BusinessException("权限列表id匹配失败");
  }

  // 修改角色
  sysRole.setName(updateSysRoleParam.getName())
    .setType(updateSysRoleParam.getType())
    .setRemark(updateSysRoleParam.getRemark())
    .setState(updateSysRoleParam.getState())
    .setUpdateTime(new Date());
  boolean updateResult = updateById(sysRole);
  if (!updateResult) {
   throw new DaoException("修改系统角色失败");
  }

  // 获取之前的权限id集合
  List<Long> beforeList = sysRolePermissionService.getPermissionIdsByRoleId(roleId);
  // 差集计算
  // before:1,2,3,4,5,6
  // after: 1,2,3,4,7,8
  // 删除5,6 新增7,8
  // 此处真实删除,去掉deleted字段的@TableLogic注解
  Set<Long> beforeSet = new HashSet<>(beforeList);
  Set<Long> afterSet = new HashSet<>(permissionIds);
  SetUtils.SetView deleteSet = SetUtils.difference(beforeSet, afterSet);
  SetUtils.SetView addSet = SetUtils.difference(afterSet, beforeSet);
  log.debug("deleteSet = " + deleteSet);
  log.debug("addSet = " + addSet);

  // 删除权限关联
  UpdateWrapper updateWrapper = new UpdateWrapper();
  updateWrapper.eq("role_id",roleId);
  updateWrapper.in("permission_id",deleteSet);
  boolean deleteResult = sysRolePermissionService.remove(updateWrapper);
  if (!deleteResult) {
   throw new DaoException("删除角色权限关系失败");
  }
  // 新增权限关联
  boolean addResult = sysRolePermissionService.saveSysRolePermissionBatch(roleId, addSet);
  if (!addResult) {
   throw new DaoException("新增角色权限关系失败");
  }
  return true;
 }

权限管理

权限树形列表

  • 用户设置角色权限时,选择
  • 权限菜单权限分为菜单和功能权限
  • 后台获取三层权限树
@Override
 public List<SysPermissionTreeVo> getAllMenuTree() throws Exception {
  List<SysPermission> list = getAllMenuList();
  // 转换成树形菜单
  List<SysPermissionTreeVo> treeVos = convertSysPermissionTreeVoList(list);
  return treeVos;
 }

 @Override
 public List<SysPermissionTreeVo> convertSysPermissionTreeVoList(List<SysPermission> list) {
  if (CollectionUtils.isEmpty(list)) {
   throw new IllegalArgumentException("SysPermission列表不能为空");
  }
  // 按level分组获取map
  Map<Integer, List<SysPermission>> map = list.stream().collect(Collectors.groupingBy(SysPermission::getLevel));
  List<SysPermissionTreeVo> treeVos = new ArrayList<>();
  // 循环获取三级菜单树形集合
  for (SysPermission one : map.get(LevelEnum.ONE.getKey())) {
   SysPermissionTreeVo oneVo = SysPermissionConvert.INSTANCE.permissionToTreeVo(one);
   Long oneParentId = oneVo.getParentId();
   if (oneParentId == null || oneParentId == 0) {
    treeVos.add(oneVo);
   }
   List<SysPermission> twoList = map.get(LevelEnum.TWO.getKey());
   if (CollectionUtils.isNotEmpty(twoList)) {
    for (SysPermission two : twoList) {
     SysPermissionTreeVo twoVo = SysPermissionConvert.INSTANCE.permissionToTreeVo(two);
     if (two.getParentId().equals(one.getId())) {
      oneVo.getChildren().add(twoVo);
     }
     List<SysPermission> threeList = map.get(LevelEnum.THREE.getKey());
     if (CollectionUtils.isNotEmpty(threeList)) {
      for (SysPermission three : threeList) {
       if (three.getParentId().equals(two.getId())) {
        SysPermissionTreeVo threeVo = SysPermissionConvert.INSTANCE.permissionToTreeVo(three);
        twoVo.getChildren().add(threeVo);
       }
      }
     }
    }
   }

  }
  return treeVos;
 }

前端JSON格式

http://127.0.0.1:8888/sysPermission/getAllMenuTree

权限编码列表

返回当前用户所有的权限编码,方便前端展示导航菜单和功能按钮

http://127.0.0.1:8888/sysPermission/getPermissionCodesByUserId/1

{
 "code": 200,
 "msg": "操作成功",
 "success": true,
 "data": [
 "system:management",
 "system:management",
 "sys:user:management",
 "sys:user:management",
 "sys:role:management",
 "sys:permission:management",
 "sys:department:management",
 "sys:user:add",
 "sys:user:add",
 "sys:user:update",
 "sys:user:update",
 "sys:user:delete",
 "sys:user:delete",
 "sys:user:info",
 "sys:user:info",
 "sys:user:page",
 "sys:user:page",
 "sys:user:update:password",
 "sys:user:update:head",
 "sys:role:add",
 "sys:role:update",
 "sys:role:delete",
 "sys:role:info",
 "sys:role:page",
 "sys:permission:add",
 "sys:permission:update",
 "sys:permission:delete",
 "sys:permission:info",
 "sys:permission:page",
 "sys:permission:all:menu:list",
 "sys:permission:all:menu:tree",
 "sys:permission:menu:list",
 "sys:permission:menu:tree",
 "sys:permission:codes",
 "sys:department:update",
 "sys:department:delete",
 "sys:department:info",
 "sys:department:page"
 ],
 "time": "2019-11-02 00:32:17"
}

注意

使用Shiro注解@RequiresPermissions进行controller方法权限过滤

@RequiresPermissions("sys:department:add")

生成代码时,可配置生成RequiresPermissions注解

 // 是否生成Shiro RequiresPermissions注解
  codeGenerator.setRequiresPermissions(true);

生成或新增的controller方法,需要进行权限管理,需要到sys_permission表新增权限编码记录,并给相应角色赋予权限

总结

以上所述是小编给大家介绍的spring-boot-plus V1.4.0发布 集成用户角色权限部门管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Spring Boot集成spring-boot-devtools开发时实现热部署的方式

    热部署是什么 大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的Class文件,这个文件里记录着和代码等对应的各种信息,然后Class文件将被虚拟机的ClassLoader加载. 而热部署正是利用了这个特点,它监听到如果有Class文件改动了,就会创建一个新的ClaassLoader进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前. 类加载机制 Java中的类经过编译器可以把代码编译为存储字节码的C

  • Spring Boot集成netty实现客户端服务端交互示例详解

    前言 Netty 是一个高性能的 NIO 网络框架,本文主要给大家介绍了关于SpringBoot集成netty实现客户端服务端交互的相关内容,下面来一起看看详细的介绍吧 看了好几天的netty实战,慢慢摸索,虽然还没有摸着很多门道,但今天还是把之前想加入到项目里的 一些想法实现了,算是有点信心了吧(讲真netty对初学者还真的不是很友好......) 首先,当然是在SpringBoot项目里添加netty的依赖了,注意不要用netty5的依赖,因为已经废弃了 <!--netty--> <

  • SpringBoot Mybatis Plus公共字段自动填充功能

    一.应用场景 平时在建对象表的时候都会有最后修改时间,最后修改人这两个字段,对于这些大部分表都有的字段,每次在新增和修改的时候都要考虑到这几个字段有没有传进去,很麻烦.mybatisPlus有一个很好的解决方案.也就是公共字段自动填充的功能.一般满足下面条件的字段就可以使用此功能: 这个字段是大部分表都会有的. 这个字段的值是固定的,或则字段值是可以在后台动态获取的. 常用的就是last_update_time,last_update_name这两个字段. 二.配置MybatisPlus 导包:

  • springboot集成schedule实现定时任务

    背景 在项目开发过程中,我们经常需要执行具有周期性的任务.通过定时任务可以很好的帮助我们实现. 我们拿常用的几种定时任务框架做一个比较: 从以上表格可以看出,Spring Schedule框架功能完善,简单易用.对于中小型项目需求,Spring Schedule是完全可以胜任的. 1.springboot集成schedule 1.1 添加maven依赖包 由于Spring Schedule包含在spring-boot-starter基础模块中了,所有不需要增加额外的依赖. <dependenci

  • Spring Boot中使用 Spring Security 构建权限系统的示例代码

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. 权限控制是非常常见的功能,在各种后台管理里权限控制更是重中之重.在Spring Boot中使用 Spring Security 构建权限系统是非常轻松和简单的.下面我们就来快速入门 Spring Security .在开始前我们需要一对

  • 详解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步骤

    Spring Boot中全局唯一流水号ID生成器集成实验 概述 流水号生成器(全局唯一 ID生成器)是服务化系统的基础设施,其在保障系统的正确运行和高可用方面发挥着重要作用.而关于流水号生成算法首屈一指的当属 Snowflake 雪花算法,然而 Snowflake本身很难在现实项目中直接使用,因此实际应用时需要一种可落地的方案. UidGenerator 由百度开发,是Java实现的, 基于 Snowflake算法的唯一ID生成器.UidGenerator以组件形式工作在应用项目中, 支持自定义

  • Springboot集成Kafka实现producer和consumer的示例代码

    本文介绍如何在springboot项目中集成kafka收发message. Kafka是一种高吞吐量的分布式发布订阅消息系统,有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能.高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息.支持通过Kafka服务器和消费机集群来分区消息.支持Hadoop并行数据加载. 安装Kafka 因为安装kafka需要zookeeper的支持,所以Windows安装时需要将zookee

  • 详解Spring boot上配置与使用mybatis plus

    http://mp.baomidou.com/#/?id=%e7%ae%80%e4%bb%8b这个是mybatisplus的官方文档,上面是mybtisplus的配置使用方法,以及一些功能的介绍 下面开始配置 maven依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <

  • spring boot 1.5.4 集成shiro+cas,实现单点登录和权限控制

    1.添加maven依赖(先安装好cas-server-3.5.2,安装步骤请查看本文参考文章) <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.2.4</version> </dependency> <dependency> <groupId>

  • spring-boot-plus V1.4.0发布 集成用户角色权限部门管理(推荐)

    RBAC用户角色权限 用户角色权限部门管理核心接口介绍 Shiro权限配置

  • Spring Boot中使用Swagger3.0.0版本构建RESTful APIs的方法

    目录 一.项目描述 二.简介 三.Swagger2.X和Swagger3.0.0 的对比 1)SpringFox 2.x 发布 2)SpringFox 3.0.0 发布 3)swagger3.0 与2.xx配置差异: 四.注解说明 @Api @ApiOperation @ApiImplicitParams @ApiImplicitParam @ApiResponses @ApiModel @ApiModelProperty @ApiIgnore 五.案例准备工作 0.项目目录 1.pom依赖 2

  • Spring Boot系列教程之7步集成RabbitMQ的方法

    前言 RabbitMQ是一种我们经常使用的消息中间件,RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.RabbitMQ主要是为了实现系统之间的双向解耦而实现的.当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层.保存这个数据. AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件

  • Spring Boot 2.x 把 Guava 干掉了选择本地缓存之王 Caffeine(推荐)

    环境配置: JDK 版本:1.8 Caffeine 版本:2.8.0 SpringBoot 版本:2.2.2.RELEASE 一.本地缓存介绍 缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力. 之前介绍过 Redis 这种 NoSql 作为缓存组件,它能够很好的作为分布式缓存组件提供多个服务间的缓存,但是 Redis 这种还是需要网络开销,增加时耗.本地缓存是直接从本地内存中读取,没有网络开销,例如秒杀系统或者数据量小

  • Spring boot连接MySQL 8.0可能出现的问题

    前言 在学习任何一个后端技术,如果不让数据库参与进来,那只能说在学习过程中都不算完整的. 以前用的是5.7版本的MySQL,在学习实践Springboot的时候顺带升级了一下8.0,遇到了一些坑,在这记录一下,有碰到同类问题的童鞋需要自取. 下面话不多说了,来一起看看详细的介绍吧 1.使用 navicat连接发现报错1251- Client does not support authentication protocol 错误 这个笔者查询资料发现是新版本的加密规则变了,在mysql8之后,加密

  • 把spring boot项目发布tomcat容器(包含发布到tomcat6的方法)

    spring boot因为内嵌tomcat容器,所以可以通过打包为jar包的方法将项目发布,但是如何将spring boot项目打包成可发布到tomcat中的war包项目呢? 1. 既然需要打包成war包项目,首先需要在pom.xml文件中修改打包类型,将spring boot默认的<packaging>jar</packaging>修改为<packaging>war</packaging>形式: 2. 其次spring boot的web项目中内嵌tomca

  • Spring Boot 集成Elasticsearch模块实现简单查询功能

    目录 背景 系统集成 引入jar包 application.yml文件中添加ES配置 创建文档实体 接口实现 具体实现 基础查询 新增文档 请求参数 Controller实现 返回结果 修改文档 通过id查询文档信息 Controller实现 删除文档 Controller实现 分页查询 Controller实现 返回结果 模糊查询 Controller实现 范围查询 Controller实现 总结 背景 项目中我们经常会用搜索功能,普通的搜索我们可以用一个SQL的like也能实现匹配,但是搜索

  • Spring Boot与React集成的示例代码

    前言 前不久学习了Web开发,用React写了前端,Spring Boot搭建了后端,然而没有成功地把两个工程结合起来,造成前端与后端之间需要跨域通信,带来了一些额外的工作. 这一次成功地将前端工程与后端结合在一个Project中,记录一下,也希望能帮到那些和我一样的入门小白. 环境 Windows 10 - x64, Java 1.8.0, node v8.9.4, npm 6.1.0 前奏 *JDK, Node 和 NPM请自行安装 新建一个Spring Boot工程 在Intellij里选

  • Spring boot实现应用打包部署的示例

    1.Spring Boot内置web Spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动.其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat).当然你也可以将项目打包成war包,放到独立的web容器中(Tomcat.weblogic等等),当然在此之前你要对程序入口做简单调整. 对server的几个常用的配置做个简单说明: # 项目contextPath,一般在正式发布版本中,我们不配置 server.context-

  • Spring Boot的应用启动与关闭的方法

    Spring Boot,作为Spring框架对"约定优先于配置(Convention Over Configuration)"理念的最佳实践的产物,它能帮助我们很快捷的创建出独立运行.产品级别的基于Spring框架的应用,大部分Spring Boot应用只需要非常少的配置就可以快速运行起来,是一个与微服务(MicroServices)相当契合的微框架. 1. Spring Boot应用打包 Spring Boot应用可以打成jar包,其中内嵌tomcat,因此可以直接启动使用.但是在S

随机推荐