点击蓝色“java版web项目”关注我哟

加个“星标”,优质文章,第一时间送达

上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家

作者:_liuxx

cnblogs.com/liuyh/p/8027833.html

前后端分离模式下,所有的交互场景都变成了数据,传统业务系统中的权限控制方案在前端已经不再适用,因此引发了我对权限的重新思考与设计。对于非前后端分离模式下的权限思考,看这里:通用数据权限的思考与设计

权限控制到底控制的是什么?

在理解权限控制之前,需要明白两个概念:资源和权限。什么是资源,对于一个系统来说,系统内部的所有信息都可以理解为这个系统的资源。页面是资源、数据是资源、按钮是资源、图片是资源、甚至页面上一条分割线也可理解为是这个系统的资源。

而权限就是访问某个资源所需要的标识。无论系统的权限如何设计,在用户登录时,都可以计算得出用户所拥有的权限标识集合,也就确定了该用户能访问哪些系统资源,这就是我理解的权限控制的本质。于是我们可以得出:权限控制是控制登录用户对于系统资源的访问。

前后端分离模式下,前后端在权限控制中各自的职责是什么?

在弄清前后端在权限控制中各自的职责是什么之前,需要理解前后端各自在系统中的职责。这个还是很好理解:

  • 服务端:提供数据接口。

  • 前端:路由控制、页面渲染。

由于前端负责与用户交互,用户所能操作的资源入口都是由前端进行控制,那么前端的权限控制就包括:

前端路由的权限控制,过滤非法请求,用户只能访问权限范围内的页面资源。
页面内组件的权限控制,根据用户的权限控制页面组件的渲染。包括各种按钮、表格、分割线等。

随着前端组件化的快速发展,用户所看到的一切均可理解为组件,页面是个大组件,其内部由各个小组件拼凑而来,那么前端权限控制最终落地到对组件的权限控制。于是脑补了出了最优雅的权限组件使用方式:

<组件 permissionName='xxx' />

前端可以渲染出用户权限范围内的各种系统资源,但是不能保证数据接口的安全性,某些比较喜欢折腾的用户完全可以越过前端的页面访问我们系统的数据接口,那么服务端的权限控制最终落地到对接口的权限验证。

实现思路

引上文,系统的一切资源均可进行权限控制,实际上也可以做到,但在我们实际的操作过程中,往往不需要细化到分割线那种程度。这里以按钮级权限控制为例做实现说明,如果有更细粒度的权限需求,此思路依然可行。

前端路由权限控制。用户登录时拿到用户拥有的权限标识集合,在前端存储。路由变化时,进行权限判断,通过则渲染对应页面组件,否则渲染403组件。示例代码:

let hasPermission = permission.check(current.permissionName);

<div className={styles.content}>    {hasPermission ? children : <Exception type={403}/>}div>

封装bird-button权限按钮组件,传入按钮所需权限名,内部进行权限判断,通过则渲染按钮。

<BirdButton permissionName={'sys'} type='primary'>测试按钮BirdButton>

服务端。服务端权限验证很好理解。使用拦截器验证当前请求的权限。代码示例:

public class SsoAuthorizeInterceptor extends HandlerInterceptorAdapter {

    @Autowired    private TicketHandler ticketHandler;

    @Autowired    private SsoAuthorizeManager authorizeManager;

    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        if (!(handler instanceof HandlerMethod)) return false;

        HandlerMethod handlerMethod = (HandlerMethod) handler;        SsoAuthorize authorize = handlerMethod.getMethodAnnotation(SsoAuthorize.class);        if (authorize != null) {            TicketInfo ticketInfo = ticketHandler.getTicket(request);            if (ticketInfo == null) {                throw new UnAuthorizedException("用户信息已失效.");            }

            String[] requirePermissions = authorize.permissions();            if(requirePermissions.length==0)return true;

            boolean isCheckAll = authorize.isCheckAll();            UserPermissionChecker permissionChecker = authorizeManager.getUserPermissionChecker();            if(!permissionChecker.hasPermissions(ticketInfo.getUserId(),requirePermissions,isCheckAll)){                throw new ForbiddenException("用户没有当前操作的权限.");            }        }

        return true;    }}

源码地址

本博客涉及到的前端权限控制思路均已在:

https://github.com/liuxx001/bird-front

项目中实现,项目中除了按钮级权限方案还提供了后台业务系统开发中常用的数据组件,包括:

下拉选择器:bird-selector。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-selector.md

全自动数据表格:bird-grid。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-grid.md

全自动树表:bird-tree-grid。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-tree-grid.md

数据树:bird-tree。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-tree.md

全自动表单:bird-form。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-form.md

权限按钮:bird-button。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-button.md

所有业务组件的理念均是结合服务端接口进行组件的封装,兼顾灵活性的同时保证更优的业务开发速度。

欢迎指正,提出不同的看法。

说句题外话,有不少人想加老赵的微信,姑且放出来,但是坑位有限哦

猜你喜欢

1、Java 面试题 :百度前 200 页都在这里

2、StringBuilder为什么线程不安全?

3、图文讲解,团队开发中的 Git 最佳实践

4、5 门可能衰落的编程语言

5、再见微服务

6、你一定要知道,关于https的五大误区

7、详解 Tomcat 的连接数与线程池

8、JAVA开发中常用的四种加密方法

强烈推荐一位大佬的公众号

好文章,我在看

web项目设计文档_web项目前后端分离模式下的权限设计方案相关推荐

  1. 前后端分离模式下的权限设计方案

    前后端分离模式下,所有的交互场景都变成了数据,传统业务系统中的权限控制方案在前端已经不再适用,因此引发了我对权限的重新思考与设计. 权限控制到底控制的是什么? 在理解权限控制之前,需要明白两个概念:资 ...

  2. 前后端分离开发下的权限管控 :SpringSecurity 框架

    首先在了解前后端分离模式下使用SpringSecurity框架之前,我们需要先了解token和jwt(Json Web Token)技术 token 和 session 的区别? 由于http协议是无 ...

  3. 【sprintboot+vue】前后端分离模式下的登录验证码验证

    [项目背景] 考虑登录时的验证安全,需要添加验证码验证,纯前端实现的验证码其实没有真正意义上做到安全验证的要求,简单一个网页爬虫就能获取到前端生成的验证码,所以应该由后台生成验证码,并由后台完成校验过 ...

  4. java基于springboot+vue的在线文档管理系统 nodejs 前后端分离

    随着社会的发展,社会的各行各业都在利用信息化时代的优势.计算机的优势和普及使得各种信息系统的开发成为必需. 在线文档管理系统,主要的模块包括查看首页.个人中心.公告信息管理.部门信息管理.岗位管理.员 ...

  5. 前后端分离模式下前端与后端数据交互

    下面举的例子就是使用jQuery Ajax和Python Flask进行前后端交互时,前端提交表单数据到后端,后端返回JSON数据给前端. 前端GET提交表单数据: # GET请求var data = ...

  6. vue后端必须接口吗_前后端分离模式,后端说开发完才能给接口文档,合理吗

    背景: 汇总了下老王在其他平台的原创回复,欢迎关注老王原创公众号[软件老王],关注不迷路. 一.后端开发完接口才给出接口文档,合理吗? 本人所在的项目组做项目过程中,后端不会先给出接口文档,而是要等他 ...

  7. 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo是基于数据库的代码自动生成工具,低代码编程技术的实现,可以零代码自动生成SpringBoot项目工程.生成JavaBean.生成前后端分离的CRUD代码.生成MyBaits的Mapper ...

  8. W3C近期要闻:与Mozilla MDN合作联合开发Web平台文档

    作者 | W3C中国 「OpenWeb开发者」依托于BOW(Brillant Open Web)团队,是一个专门的 Web 技术建设小组,致力于推动 Open Web 技术的发展,将不定期为读者同步W ...

  9. java生成iso9660工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo_20210212 v7.0.0 正式版发布,此次版本更新如下: 1.新增对DB2数据库的支持 2.新增按字段生成文件,支持把字段.JSON.XML数据转换成任何代码 3.新增大量新的自 ...

  10. freemarker mysql 生成bean_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.6.6版)...

    TableGo_20191026 v6.6.6 正式发布,此次版本更新如下: 1.新增通过自定义模板生成Word文档的功能,可以使用FreeMarker模板生成自定义格式的数据库文档. 2.新增 Sw ...

最新文章

  1. python应该安装哪一个_python安装到哪个盘
  2. 用上微软Bosque 困扰程序员30年的问题解决了
  3. 扩展语法检查(SLIN检查)
  4. 简单的jQuery扩展函数-让函数缓冲执行
  5. Flink – window operator
  6. JavaSE 学习参考:变量(1)
  7. C++动态链接库的制作
  8. 分布式缓存的面试题9
  9. Java io流---拷贝文件夹下的所有文件和目录
  10. poi的excel解析工具类
  11. CUDA 和 GPU
  12. STDN:Scale-Transferrable Object Detection 论文解析
  13. python类使用异步_异步Python类
  14. Flutter状态管理Provider的简单使用
  15. 南桥和北桥-主板芯片组发展史
  16. Android 炫酷动画APP,21 款炫酷动画开源框架,照亮你的APP
  17. 镜像服务器有什么作用,镜像文件、镜像服务器是什么意思
  18. Git入门、gitHub、gitee、gitLab远程库的学习和集成IDEA
  19. 操作系统学习笔记(13) 互斥与同步的经典问题 -哲学家进餐问题
  20. 10 个 MySQL 经典错误【转】

热门文章

  1. 2021全国研究生数学建模竞赛F题思路
  2. 【图像处理】基于matlab GUI图像直方图+滤波处理【含Matlab源码 839期】
  3. 【雷达通信】基于matlab GUI雷达定位模拟【含Matlab源码 304期】
  4. 【数字信号】基于matlab GUI虚拟信号发生器(各种波形)【含Matlab源码 271期】
  5. 【图像增强】基于matlab局部对比度增强的CLAHE算法直方图增强【含Matlab源码 1341期】
  6. case when 效率_采用机械涡轮复合增压系统优化7.8 L柴油机的 稳态效率和排放性能...
  7. 话费充值 php,话费充值示例代码
  8. php打印当前页面隐藏页眉,javascript实现window.print()去除页眉页脚_javascript技巧
  9. sping jdbc 链接mysql_java项目使用spring jdbc连接数据库
  10. topcoder srm 440 div1