前、后端分离权限控制设计和实现思路

点击上方“Java之间”,选择“置顶或者星标”

你关注的就是我关心的!

来源:8rr.co/9QUT

简述

近几年随着react、angular、vue等前端框架兴起,前后端分离的架构迅速流行。但同时权限控制也带来了问题。

网上很多前、后端分离权限仅仅都仅仅在描述前端权限控制、且是较简单、固定的角色场景,满足不了我们用户、角色都是动态的场景。且仅仅前端进行权限控制并不是真正意义的权限控制,它只是减少页面结构暴露、增强用户体验的功效。

场景

系统为后台管理系统,包含了用户创建、用户登录、用户管理自己的资源。用户经常会新增、删除,也可以根据工作情况随时调整页面、功能权限,所以采用用户-角色-页面权限方案实现。

为什么不行:

  1. 根据前端路由表显示左侧菜单,但vue-router的路由表主要为了组织代码,经常我们所需要的菜单并非一致。比如某个前端路由a子路由有b、c,但菜单中我们想要直接一级菜单就显示b、c或者将b、c各放到其他菜单下。所以这种非常不灵活。

  2. 一个路由是菜单还是页面?是否需要显示到菜单中?是否验证权限?哪个角色或者用户拥有权限?这些都需要写到前端路由里面,一旦有任何权限变动就要大量调整代码。

  3. 如果权限写死在前端,那么角色或者用户必须已知且固定不变。比如页面1的meta增加属性标识可访问的角色为a和b

页面

一个页面即一个前端页面,比如首页、用户管理页、资源管理页等。

基本思路为:前端路由保持不变,数据库存储菜单结构、页面权限控制(可以直接做成一个页面来方便管理)等,前端根据数据库中的菜单结构和权限信息来渲染一个菜单出来并只显示其有权限的菜单,并在路由守卫中进行权限控制防止手动输入path越权打开页面

1、前端路由(vue-router)中需要正常创建页面及路由。

2、数据库存储菜单结构和页面权限信息,

  1. 菜单(目录、非内容页)可以自己创建,不必要求前端路由中有,因为这是指菜单的可视化的组织结构

  2. 页面(内容页)必须是前端路由中已有页面,因为这是用户需要访问的内容。

  3. 菜单和页面组成上下级关系,一级可以是菜单也可以是内容页,内容页也可以放在菜单下,不可见的内容页也可以放在一个普通内容页下,这样理论(需要页面菜单样式支持)可以组成无限级菜单。面包屑导航也根据此层级递归查询得到。

  4. 菜单和页面的基本属性包括title(对应路由title)、name(对应路由name)、path(对应路由path)、父级、类型(菜单/页面)、是否可见(左侧菜单栏是否显示:部分页面可能是页面内的链接进去)、是否需要验证权限(部分页面比如首页无需验证权限大家都可以进入)

  5. 不需要控制权限且不需要显示到左侧菜单的路由这里可以不进行管理,比如404页面等

3、前台打开后获取获取数据库的所有菜单、页面及结构,根据是否登录、是否需要验证权限等进行控制,或无权限跳转至登录页

4、用户登录成功后,再获取用户对应的的页面权限列表,使用上一步获得的所有页面、结构和用户拥有权限的列表渲染出一个菜单,只包含此用户拥有权限的,提升用户体检,避免显示大量用户不能访问的菜单影响使用和不必要的功能暴露。

5、路由守卫中根据上一步获得的权限列表判断每个跳转,无权限可返回404或无权限页面,防止用户手动输入path越权访问

页面管理:

页面编辑:

功能

部分功能有事需要单独控制权限,比如用户管理页面可能允许多个角色查看,但是其中的"创建用户"功能只允许某一个角色使用,那么仅仅使用页面权限是不够。所以需要细粒度的功能权限控制。

网上的方案都是说:根据资源控制增、删、改、查等等,比如针对用户就是用户的创建、修改、删除、查询等。但是在我的实际使用中发现并不切合实际,最起码对像我这种管理后台,资源并不单纯的增删改查,可能有其他地方的其他操作中也会对此用户资源造成影响,比如禁用、删除角色也要禁用、删除用户,那么这个权限到底属于角色的权限还是属于用户的权限,或者后台又改了,角色又影响了其他资源或者不再对用户进行操作,都会影响权限控制。

所以更合理的方法应该为将每个功能单独进行控制并和页面进行关联,且不限定必须是增、删、改、查四种,可以任意定制,只需要与前后端开发约定一个唯一的标识即可。

如上的例子中,用户管理页面下有用户各种功能,角色管理页面中也有个角色禁用、删除功能,可以分别定义标识为roledisable、roledelete,如果拥有roledelete权限即可,即使没有userdelete权限,也可以直接删除用户,否则就不要给其role_delete权限。

用户登录后,从数据库获取其所拥有的的权限列表并存入vuex,包含页面和功能对应关系,例如页面name为user:{user: ['userdelete', 'userquery']},页面中根据删除按钮可以v-if="hasPermission('user_delete')"判断即可

页面功能管理:

获取用户拥有的权限:

角色

一个角色类似于一个身份或岗位,每个角色有自己的权限范围。

  1. 一个角色可以拥有多个页面权限。

  2. 一个角色可以拥有多个功能权限。

角色管理:

角色分配权限:

用户

用户可以创建、删除,一个用户随时可能变更工作内容,或者身兼数职,所以可以为其分配一个或者多个角色,他拥有的角色的权限就是他的权限。此时已经可以打通权限前端的权限分配,用户-角色-页面权限、功能权限。

用户管理:

用户分配角色:

前端效果

前端页面菜单效果:

后端权限

传统前后端不分离的情况下,路由都在后端统一管理,简单的方法比如用户管理页面/user/那么他里面使用的接口都使用/user/add、/user/delete等相同前缀,那么只要判断用户拥有/user/权限就可以访问/user/*所有接口。

前后端分离后面临的问题:

  1. 前、后端分别有自己的路由,且一个页面会同时调后端多个不同模块下的接口,这样一来就无法通过以上传统方式判断权限。

如此一来吗,就需要有前端页面到后端接口的管理,明确一个页面会调用哪几个接口。这样当授权用户页面时,系统就可以根据此关系推断哪些接口具有权限。

接口

方案:

  1. 需要控制权限的接口进行上传管理(可以做成管理页面)

  2. 每个页面和功能可以关联多个接口,比如用户页面关联了用户查询接口和用户编辑接口,用户删除功能关联用户删除接口

  3. 后端对请求的路径进行判断,用户->角色->页面/功能->接口,拥有接口权限即允许访问

  4. 前后端分团队开发,不容易一一对照,且前端有自己的路由(此路由受限于代码组织结构)等等,无法使用传统方式简单处理

  5. 相同的接口可能会被前端多个页面多次利用

接口管理:

页面关联接口、功能关联接口:

请求的接口无权限时:

接口后端权限控制

后端控制其实很简单,只要前面管理功能做好即可,基本逻辑为:

  1. 用户访问接口

  2. 判断用户和当前path,根据用户->角色->页面/功能->接口 得到当前用户有权限的接口列表与当前path相比

  3. 若无权限(某些接口只需要登录就能访问的,比如获取用户姓名信息的需要排除在外)则直接返回失败,前端全局捕获后给出无权限提示

数据库表示例

红色表为实体表,蓝色表为关联关系表。基本为用户->角色->页面/功能->后端接口

最近热文阅读:

1、为什么很多SpringBoot开发者放弃了Tomcat,选择了Undertow?

2、面试官:为什么 wait() 方法需要写在while里,而不是if?

3、太赞了,Intellij IDEA 竟然把 Java8 的数据流问题这么完美的解决掉了!

4、再见,Lombok,没想到你才是让我们代码处于了“亚健康”状态的真正元凶!

5、SQL 查询总是先执行SELECT语句吗?你们都错了!

6、干掉 Swagger,试试这个!

7、执行COUNT(1)、COUNT(*) 与 COUNT(列名) 到底有什么区别?

8、Kafka如何通过经典的内存缓冲池设计来优化JVM GC问题?

9、求求你们了,别再写满屏的try catch了...

10、高并发:RocketMQ 削峰实战!

关注公众号,你想要的Java都在这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 针对SpringBootVue后端分离设计培养计划管理系统的设计思路和方法,一般可遵循以下步骤: 1. 需求分析:明确系统需求和功能模块,确定系统开发目标和范围。 2. 概要设计设计系统的整体框架和模块划分,确定系统的技术架构、数据模型等。 3. 详细设计:具体设计系统各个模块的功能实现,制定接口规范和数据库设计方案。 4. 编码实现:根据设计文档进行编码实现,包括端Vue和后端SpringBoot的开发。 5. 测试验收:完成编码后进行单元测试和综合测试,保证系统的质量和稳定性。 6. 部署上线:将系统部署到服务器上,并进行线上测试,确保系统可以正常运行。 在这个过程中,需要注意后端分离设计的特点,即端和后端开发相互独立,通过接口进行数据交互。因此,需要制定清晰的接口规范,确保数据传输的正确性和安全性。同时,还需要注意端和后端技术的兼容性,确保两个端能够无缝对接。 总之,针对SpringBootVue后端分离设计培养计划管理系统的设计思路和方法,需要在需求分析、概要设计、详细设计、编码实现、测试验收和部署上线等方面进行综合考虑,以确保系统的高效、稳定、安全和可维护性。 ### 回答2: Spring Boot和Vue后端分离设计是一种常用的Web应用设计模式,在设计培养计划管理系统时,可以采用以下思路和方法: 1. 后端分离后端分离是指端使用Vue进行页面渲染,后端使用Spring Boot提供接口服务。通过这种设计模式,可以有效地解耦后端逻辑,提高开发效率和系统性能。 2. 定义数据模型:根据培养计划管理系统的需求,定义必要的数据模型。这些模型可以包括学生、课程、考试等信息。使用Java对象模型或者数据库表结构来表示这些模型。 3. 设计接口:基于后端分离设计思路,使用Spring Boot设计实现RESTful接口。这些接口可以包括学生信息查询、课程安排、考试成绩录入等功能。通过严格定义接口规范,端可以通过调用这些接口获取所需的数据。 4. 端页面设计:使用Vue进行端页面的设计和开发。根据系统需求,设计学生信息展示、课程安排、考试成绩录入等页面。使用Vue提供的组件和工具,实现页面的交互和数据展示。 5. 数据交互:端通过调用后端提供的接口获取所需数据。使用Vue的Ajax、Axios等工具,发送HTTP请求并解析返回的数据。端可以根据需要进行数据筛选、排序和展示。 6. 系统安全:为了保障系统的安全性,可以在后端使用Spring Security等框架进行权限控制和身份认证。通过定义角色和权限,限制用户操作和访问敏感数据。 7. 测试和部署:在开发完成后,进行系统测试和调试。可以使用JUnit等测试框架对后端接口进行单元测试,使用Vue提供的测试工具对端页面进行测试。最后,将后端部署到服务器上,并将端页面打包部署到Web服务器上。 通过采用Spring Boot和Vue后端分离设计,可以实现系统开发的高效和灵活性。后端分离设计模式可以有效解耦后端逻辑,提高系统性能和扩展性。同时,Spring Boot和Vue作为流行的开发框架,拥有庞大的社区支持和丰富的开发资源,可以大大提升系统开发的效率和质量。 ### 回答3: SpringBoot和Vue是目非常流行的后端分离开发框架。设计和培养一个计划管理系统需要以下步骤和方法。 1.需求分析:首先,要清楚定义计划管理系统的功能和需求,包括用户管理、计划创建、查看和修改计划、日历展示等功能。 2.数据库设计:根据需求设计数据库模型,确定需要的表和字段,并建立相应的关系。 3.SpringBoot后端开发:使用SpringBoot搭建后端开发环境,根据需求编写相应的控制器、服务和数据访问层。使用Spring Security实现用户认证和授权。 4.Vue端开发:使用Vue框架搭建端开发环境,设计和开发用户界面。使用Vue Router实现页面导航和路由跳转。使用Axios进行和后端的数据交互。 5.后端接口设计:定义后端之间的接口规范,包括请求方式、参数和返回结果的格式。使用JSON进行数据交互。 6.后端联调:后端开发完成后,进行联调测试,确保后端的数据交互和功能实现的正确性。 7.部署和上线:将后端代码打包成jar包或war包,将端代码打包成静态资源,部署到服务器上,配置好相应的环境和数据库信息,使系统能在服务器上运行。 以上是一般的设计思路和方法,当然具体实现还有很多细节需要考虑,比如数据校验、异常处理、权限管理等等。一个好的计划管理系统应该具备良好的用户体验和响应速度,因此在设计和开发过程中需要注重系统的性能优化。同时,定期进行系统的维护和更新,修复漏洞和改进功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值