Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制
一. 前言
信我的哈,明天过年。
这应该是农历年前的关于开源项目 的最后一篇文章了。
有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统一认证鉴权,Spring Cloud & Alibaba + vue-element-admin实现的微服务
、前后端分离
的全栈开源项目。
有来系统 的权限设计主要是为了实现以下几点目标:
实现RBAC模式的权限管理设计
实现基于
vue-element-admin
后台菜单权限管理系统Spring Cloud Gateway
网关针对RESTful接口权限控制Vue
自定义指令实现按钮级别权限控制
二. 项目介绍
1. 项目简介
有来商城 是基于Spring Boot 2.4、Spring Cloud 2020 & Alibaba、Vue、element-ui、uni-app快速构建的一套全栈开源商城平台,包括微服务应用、管理平台、微信小程序及APP应用。
2. 项目地址
管理平台访问地址: http://www.youlai.store
【有来小店】微信小程序体验码,扫描后申请体验即可
源码地址:
项目名称 | Github | 码云 |
---|---|---|
微服务后台 | youlai-mall | youlai-mall |
管理前端 | youlai-mall-admin | youlai-mall-admin |
微信小程序 | youlai-mall-weapp | youlai-mall-weapp |
APP应用 | youlai-mall-app | youlai-mall-app |
3. 项目往期文章
后台微服务
- Spring Cloud实战 | 第一篇:Windows搭建Nacos服务
- Spring Cloud实战 | 第二篇:Spring Cloud整合Nacos实现注册中心
- Spring Cloud实战 | 第三篇:Spring Cloud整合Nacos实现配置中心
- Spring Cloud实战 | 第四篇:Spring Cloud整合Gateway实现API网关
- Spring Cloud实战 | 第五篇:Spring Cloud整合OpenFeign实现微服务之间的调用
- Spring Cloud实战 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT实现微服务统一认证授权
- Spring Cloud实战 | 最七篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案
- Spring Cloud实战 | 最八篇:Spring Cloud +Spring Security OAuth2+ Vue前后端分离模式下无感知刷新实现JWT续期
- Spring Cloud实战 | 最九篇:Spring Security OAuth2认证服务器统一认证自定义异常处理
- Spring Cloud实战 | 第十篇 :Spring Cloud + Nacos整合Seata 1.4.1最新版本实现微服务架构中的分布式事务,进阶之路必须要迈过的槛
后台管理前端
- vue-element-admin实战 | 第一篇: 移除mock接入微服务接口,搭建SpringCloud+Vue前后端分离管理平台
- vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
微信小程序
应用部署
- Docker实战 | 第一篇:Linux 安装 Docker
- Docker实战 | 第二篇:Docker部署nacos-server:1.4.0
- Docker实战 | 第三篇:IDEA集成Docker插件实现一键自动打包部署微服务项目,一劳永逸的技术手段值得一试
- Docker实战 | 第四篇:Docker安装Nginx,实现基于vue-element-admin框架构建的项目线上部署
- Docker实战 | 第五篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结
三. 数据库设计
RBAC(Role-Based Access Control)基于角色访问控制,目前使用最为广泛的权限模型。
此模型有三个角色用户
、角色
、权限
,在传统的权限模型用户直接关联加了角色
层,解耦了用户和权限,使得权限系统有了更清晰的职责划分和更高的灵活度。
以下是有来系统关于RBAC权限模型的数据库
重点说权限
,系统权限分3类,如下表:
权限名称 | 表名 | 字段 | 权限标识 |
---|---|---|---|
菜单权限 | sys_menu | ||
接口权限 | sys_permission | type=1 | PUT_/users/** |
按钮权限 | sys_permission | type=2 | system:user:add |
其实了解过目前主流开源系统的权限设计,大概率的把菜单和按钮放一块然后根据类别字段区分,以下就关于这种方式优劣发表下个人意见,仅供大家参考下不必较真:
优势:
- 合理,按钮肯定属于某个菜单之下
- 省去了权限表(sys_permission)和关联中间表这两张表
劣势:
- 菜单模块变的复杂了,菜单表多了和菜单无关联的类型字段和权限标识字段
- 菜单和按钮查询要区分类型,给代码开发带来复杂和影响查询性能
- 不能同时满足按钮权限控制和网关根据请求路径Ant匹配鉴权(具体下文说)
四. 权限系统管理界面
先看下vue-element-admin
下的RBAC模型下的后台权限管理界面,体验地址:http://www.youlai.store
- 菜单权限管理
- 角色分配权限
五. RESTful接口权限控制
1. 理论篇
上文说到的关于权限表的拆分,菜单单独一张表,按钮权限和接口权限合为一张表根据类型type字段区分,之所以这样因为接口和按钮权限有些共性,都有一个权限标识字段。
至于按钮和接口为什么要区分呢?都使用system:user:add
权限标识不可以吗?
具体做法是接口方法加上Spring Security的注解@PreAuthorize("hasPermission('system:user:add')"),在执行方法前判断用户时候拥有该权限。
答案是一般场景这样设计绝对没问题。但这里使用网关作为统一鉴权的入口,肯定希望网关一次性把鉴权的活做的干脆利落,这样就不需要在各个微服务单独的把Spring Security权限模块引入鉴权,通过网关鉴权能把职责分工明确,减少开发工作量,无权限的请求直接被网关拦截返回,不会走到微服务那里再被告知无权访问,提高请求效率。
Spring Cloud Gateway网关使用请求路径Ant匹配请求标识进行权限判断的,例如/users/1
经过Ant匹配到权限标识/users/**
,而/users/**
是被用户所持有的权限标识,这就标识用户允许访问/users/1
的请求,所以和按钮的权限标识system:user:add
是有区别的。
这样就完事了吗?当然还没,因为 有来系统 较于其他系统它是比较严格遵守REST
接口设计规范,所以如果仅仅是上面根据请求路径URL判断权限肯定是不合理的,/users/1
这个请求路径在RESTful接口下可能是GET
类型的请求也有可能是PUT
类型的请求,那该如何处理?
所以在sys_permission
表里还有一个method
字段来标识请求方法类型,值可能会是、GET、POST、PUT、PATCH、DELETE等HTTP请求方法类型,其中是不限请求方法类型的意思,然后将请求方法类型和请求路径组合得到接口的权限标识是这样的PUT_users/1
。
接下来就通过对 有来系统 的实战操作来演示网关如何细粒度对RESTful接口的权限控制。
2. 实战篇
2.1 添加权限
新增用户管理的增删改查权限
2.2 角色授权
赋予系统管理员(admin)用户查询
权限,无其他权限
2.3 加载角色权限规则至缓存
项目启动查看Redis中的角色权限规则:
看到系统管理员
这个角色是没有用户修改权限的。你可以给角色添加用户修改权限后尝试是否可以修改成功。
2.4 演示
admin
系统管理员登录执行一个用户修改
的提交的请求,看一下网关鉴权的流程:
结果可想而知,系统管理员不具有修改用户PUT_/youlai-admin/v1/users/2
权限,从缓存查询只有超级管理员具有该接口请求方法访问权限。页面结果显示如下:
六. 按钮级别权限控制
1. 理论篇
Vue除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。
这里主要使用Vue.directive
注册一个全局自定义指令v-has- permission
用于权限判断,然后在模板中的任何元素使用v-has- permission
属性。
2. 实战篇
1. 添加按钮权限
2. 角色授权
3. 加载角色按钮权限数据
完整代码:youlai-mall-admin
登录成功时获取用户信息,其中包含该用户拥有的权限字符串如下:
这里将用户权限拥有的字符串集合缓存到vuex的perms属性中:
4. 自定义和注册全局指令
有来管理前端 是基于vue-element-admin
后台前端解决方案,在
vue-element-admin
项目我们可以看到自定义指令的应用。如下:
然后复制一份permission.js
重命名为hasPermission.js
,修改后如下:
注册全局指令:
指令在组件上的应用:
5. 演示
系统管理员是没有修改
按钮的权限的,结果如下页面不显示修改按钮。
那给系统管理员添加修改
按钮的权限
再看看用户页面的显示情况
此时用户页面的修改按钮已经显示出来了,至此完成了系统的按钮权限控制。
七. 结语
本篇通过实战的方式讲述如何基于Spring Cloud Gateway + vue-element-admin技术设计一套符合RBAC规范的权限管理系统,通过网关就可以轻易实现RESTful接口方法细粒度的控制,无需将Spring Security模块引入各个微服务;以及使用Vue的自定义指令在组件中使用实现细粒度的按钮权限控制。
如果你对此系统权限设计有更好的建议,欢迎留言给我,在此感谢!
如果对项目感兴趣的话,欢迎加我微信和项目交流群。
最后预祝大家新年愉快,新的一年能够“牛”转乾坤。
Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制的更多相关文章
- 实战基于Spring Boot 2的WebFlux和mLab搭建反应式Web
Spring Framework 5带来了新的Reactive Stack非阻塞式Web框架:Spring WebFlux.作为与Spring MVC并行使用的Web框架,Spring WebFlux ...
- vue element Admin - 修改浏览器标签名 + 添加tagView标签 +固定导航头部 + 添加侧边栏Logo
1 .修改浏览器标签名称: 修改浏览器标签名称在文件:\src\settings.js image.png 2 .修改固定头部Header和侧边栏 Logo: image.png 1)侧边栏文 ...
- Spring Boot实战(3) Spring高级话题
1. Spring Aware Spring的依赖注入的最大亮点就是你所有的Bean对Spring容器的存在是没有意识的.即你可以将你的容器替换成别的容器. 实际项目中,不可避免地会用到Spring容 ...
- Spring Boot实战(1) Spring基础
1. Spring基础配置 Spring框架本身有四大原则: 1) 使用POJO进行轻量级和最小侵入式开发 2) 通过依赖注入和基于接口编程实现松耦合 3) 通过AOP和默认习惯进行声明式编程 4) ...
- Set up HTTP/2 server with Spring Boot 【基于Spring boot搭建http2.0服务器】
1. Server side With spring boot, we can set up a http server easily. Restcontroller make it easier t ...
- Spring Boot实战(2) Spring常用配置
1. Bean的Scope scope描述Spring容器如何新建Bean的实例.通过注解@Scope实现,取值有: a. Singleton:一个Spring容器中只有一个Bean的实例.此为Spr ...
- Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制
一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...
- 基于 Spring Cloud 完整的微服务架构实战
本项目是一个基于 Spring Boot.Spring Cloud.Spring Oauth2 和 Spring Cloud Netflix 等框架构建的微服务项目. @作者:Sheldon地址:ht ...
- 几种常见的微服务架构方案简述——ZeroC IceGrid、Spring Cloud、基于消息队列
微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...
随机推荐
- ctfhub技能树—RCE—综合过滤练习
打开靶机 查看页面信息 查看源码可以发现这一次过滤了很多东西,查看当前目录信息 查询到%0a为换行符,可以利用这个url编码进行命令注入,开始尝试 http://challenge-2a4584dab ...
- scp等不需要存入know_host
1.修改sshd的配置文件 vi /etc/ssh/ssh_config 修改为如下 StrictHostKeyChecking no UserKnownHostsFile /dev/null 重启s ...
- 2V升3.3V芯片,输出500MA,低功耗10uA解决方案
2V的输入电压其实非常少,一般都是镍氢电池1.2V,干电池1.5V,来给玩具,MCU单片机,模块啊,等等供电.不过2V的供电电源或者设备确实是不常见的. 一般2V升3.3V,需要升压芯片PW5100即 ...
- 【PostgreSQL】PostgreSQL数据库浅析
前言 工作中数据库用的不多,大部分都是简单查询一下了事,某项目中突然要求后端进行比较全面的数据库操作,现对自己学到的东西做一下总结. 简介 废话不多说,上官网地址: PostgreSQL 9.4.4 ...
- LOJ10096掠夺计划
题目传送门:https://loj.ac/problem/10096 ----------------------------------------------------------------- ...
- FLOYD判圈
转载一篇博客:http://blog.csdn.net/javasus/article/details/50015687 Floyd判圈算法(Floyd Cycle Detection Algorit ...
- 【Android初级】如何实现一个具有选择功能的对话框效果(附源码)
我们去餐厅吃饭时,服务员都会拿菜单给我们选择点什么菜.今天就分享一个具有选择功能的简易对话框,给用户展示一个选择列表.实现思路如下: 既然有选择列表,那么这个列表的内容肯定保存在某个地方 用户选择某一 ...
- SpringMVC听课笔记(十三:使用拦截器)
1.定义一个拦截器: 实现 HandlerInterceptor接口 2. 配置 3.运行流程 4.也可以通过<mvc:mapping>给拦截器设定特定的拦截路径,或者<mvc:ex ...
- Excel 多种粘贴方式
一.粘贴为数值. 这个功能是选择性粘贴中最常用的功能.因为excel主要功能之一就是用来做数据分析,把其他格式粘贴为数据格式才能进行数据运算,把带有公式的计算结果粘贴为数值格式可以使复制后的内容不会变 ...
- Java实现windows,linux服务器word,excel转为PDF;aspose-words,Documents4j
Java实现windows,linux服务器word,excel转为PDF:aspose-words,Documents4j 一.通过aspose-words将word,Excel文档转为PDF 1. ...