太久没写了,今天补一篇,本篇无实际代码,主要是设计思路。

关于JWT:在我所开发的系统中用户Token都是有意义的,都会携带部分数据,不过多用于userId

个人的权限系统使用历程:

基于Security(不加表、角色放在Token中)

  • 注解验证(乱七八糟)
    使用Spring Security框架,将用户角色ROLE_USER写在account表中,UserDetailsService的实现方法中封装UserDetails返回,然后在接口上添加注解进行权限校验
    好处是简单,但是权限写在逻辑里面了。改权限就要发版本,小系统可以这样干
  • 请求地址前缀验证(分模块)
    顾名思义,按照角色划分接口地址,类似于微服务模块拆分,但是这个纯粹就是为了权限验证拆。而且说实话也不好升级。

RBAC模型

用户表、角色表、功能表、接口表、关联表

凑活看。不过后面的很多思路都是基于这个表结构的。

  • RBAC数据库
    实现AccessDecisionManager接口

    FilterInvocation filterInvocation = (FilterInvocation) object;
    Set<String> uris = smsAccountRoleMapper.uris((String) authentication.getPrincipal());
    if (uris.contains(filterInvocation.getRequestUrl())) {return;
    } else {log.info("当前请求路径:[{}]用户权限为:[{}]", filterInvocation.getRequestUrl(), uris);throw new AccessDeniedException("权限不足");
    }
    

    到这里就已经实现接口权限动态配置了,但是同时到此也全都是没营养的废话,下面开始更经典的。

  • 使用Redis+JWT
    Redis用于存储JWT、JWT用来存储用户标识
    实现AuthorizationServerTokenServicescreateAccessTokenrefreshAccessToken方法,不需要实现TokenStore,直接写在MyTokenService里就行、就是一堆Token生成存储逻辑、从JWT的实现类里面拷贝一部分,再拷贝一部分Redis的就组合成了。

    技巧:以下所有存储,Redis有效期设置尽量比真实的有效期短1小时,防止Redis验证通过而Token解析失败

    前缀 含义
    UNAME_TO_ACCESS 用户标识>>>accessToken、主要用于用户封号冻结时删除Token及单设备登录限制
    ACCESS_TO_USER accessToken >>>userId、鉴于Token为JWT生成,所以此处仅用于验证Token真实性
    ACCESS_TO_REFRESH accessToken >>>refreshToken 、账号冻结时删除当前账号所有有关的Token信息
    REFRESH_TO_ACCESS refreshToken >>> accessToken、刷新令牌仅可以使用一次、且用完之后需要删除旧的accessToken
    REFRESH refreshToken信息、用于刷新令牌

    验证逻辑
    1、开放性接口直接过
    2、需要登录的由Redis负责校验是否为真实有效的Token
    3、需要进行权限校验的依靠数据库RBAC关系进行查询校验。

  • 微服务
    其实微服务和前面的一样,认证中心发放Token,网关验证鉴权、所有的逻辑基本一致

  • 前端按钮验证
    在这里要安利一个开源项目:若依,给了我很多启发。
    上文表结构接口表中有一个字段为前端验证key,具体使用方式为后端在用户登录之后返给前端一个Set集合,前端在组件中封装一个标签,类似v-if,参数为这个按钮的验证key,如果Set集合中有就显示,没有就不显示按钮。
    下图是若依的验证逻辑,考虑的非常周到,一个按钮可能对应多个接口:

    建议:尽量和后端接口名保持一致,因为后端接口你不可能提供两个相同的(尽量使用PostMapping

  • 前端页面验证
    页面相较于按钮复杂之处在于后端的一个接口会在多个页面调用且一个页面会调用后端多个接口,所以后端提供路由配置就显得不是那么方便,所以我的思路是:前端知道当前页面会调用哪些接口,而且也知道哪些接口有权限验证,同时考虑到前端某些数据可能今天在这里展示,明天就换位置了,所以将页面级的路由交于前端自行校验,具体逻辑为:
    1、当前页面存在开放性接口,如查询,那么直接展示
    2、当前页面所有接口都需要权限,那么验证后端返回的Set集合中是否和当前页面的接口验证key存在交集,如果有展示,如果没有隐藏

DBAC模型

顾名思义:同一个接口,不同的人访问看到的数据是不一样的,这个不一样不是指看到的自己的数据不一样,而是同样一个页面,你只能看自己的,老师能看班级的,校长能看全校的。

数据权限一定要根据系统实际使用进行设计,虽然有某些通用的设计方案,但是如果直接拿过来使用而不加以设计那么一定会面临性能问题。

  • 统一权限
    某人对系统的操作等级是固定的,只在角色变更时变化,那么可以使用若依的那套实现方式,MyBatis拦截器的方式,然后判断用户权限等级拼接SQL后缀、不过若依那一套简单,SQL基本固定,因为他的部门角色是基础实现。
  • 拆分权限
    一个用户对于系统中的不同接口的访问权限是不同的,不单单是部门的问题(例如一个部门的部长犯了错误,公司让他回家反省,那么他还是部长,但是可能他再登录系统就只能看自己的数据了)
    思路:将前端的验证思路搬到后端,在MyBatis接口上添加注解,在拦截器中判断当前用户对于当前SQL的权限等级是什么,查询出不同的SQL后缀拼接到查询语句中。

    知道用户、mapper接口、那么就能查看对应的SQL后缀是什么,进行动态拼接就可以了。

欢迎留言,有时间也搞个开源项目大家玩玩。

浅谈权限设计(从接口权限到数据权限)相关推荐

  1. 浅谈 PHY 芯片 UTP 接口直连(不使用变压器)的设计

    浅谈 PHY 芯片 UTP 接口直连(不使用变压器)的设计 1.背景: 一个项目, 需要把IP101GR模块的UTP接口和交换机芯片 (RTL8305NB) 的 UTP 接口连在一起,设计的时候没有考 ...

  2. 浅谈数据库设计技巧(上)

    浅谈数据库设计技巧(上) 说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡 ...

  3. 中鸣循迹机器人_浅谈机器人设计方法

    浅谈机器人设计方法 摘要: 机器人是人类完成智能化中非常重要的工具, 随着时代的发展, 机器 人已经在世界有了一定的发展,甚至很多国家机器人已经运用到实际的生活中 去. 而机器人的设计方法无疑是很多人 ...

  4. 浅谈工厂设计--java必备技能

    浅谈工厂设计–java必备技能 说到工厂,我就联想到了亚洲的大工厂富士康–接过订单然后按照固定的模板生产商品,其实java中工厂类中的工厂方法也是一样,接过参数,根据参数来生产需要的商品: 今天我们一 ...

  5. 浅谈购物中心设计之外立面设计注意点

    购物中心的主体定位中,可以通过外立面设计充分的发挥和展现个性,吸引八方游客,从而使购物中心的商圈辐射超越了地区的界限.具体来说,购物中心外立面设计需要注意哪些方面呢?我们今天就来浅谈购物中心设计之外立 ...

  6. 计算机中用户的分类有哪些,用户分类浅谈交互设计 -电脑资料

    说到网络产品,离不开的话题就是用户,就像传统行业的消费者, 不分类不好定位, 好的用户分类让我知道了我在追求哪些人,满足哪些人,影响哪些人.但分不好类又会错位,更糟,那怎样才能对某一款产品的用户群进行 ...

  7. 数据权限框架:一个实现数据权限与业务模块完全分离,让数据权限变成独立功能模块的数据权限框架

    meng框架 介绍 meng框架是一个实现了行数据权限和列数据权限的数据权限框架: meng框架能让数据权限变成一个独立的功能模块,与业务模块完全分离,在已经实现的业务逻辑中添加数据权限不需要对原来的 ...

  8. 实现权限控制_SpringCloud 微服务实现数据权限控制

    前章讲了如何进行用户权限验证<SpringCloud下的用户鉴权方案>,它是微服务下统一资源访问权限的控制,就像一道墙保护着SpringCloud集群下的各个业务应用服务.而本章要讲的是权 ...

  9. 【T+】非主管操作员查询科目余额表提示 权限配置异常,没有[AccountDTO]数据权限

    问题现象:非主管操作员查询科目余额表提示 权限配置异常,没有[AccountDTO]数据权限,打了最新的补丁(13.000.001.0367.0117)也是如此. 解决办法: 进入用户权限,点击这个报 ...

  10. [UWP]浅谈按钮设计

    一时兴起想谈谈UWP按钮的设计. 按钮是UI中最重要的元素之一,可能也是用得最多的交互元素.好的按钮设计可以有效提高用户体验,构造让人眼前一亮的UI.而且按钮通常不会影响布局,小小的按钮无论怎么改也不 ...

最新文章

  1. LTE MIB 的发送周期
  2. 并发异步处理队列 .NET 4.5+
  3. 计算机算法对程序设计的作用,计算机编程中数学算法的优化策略
  4. [UWP]了解IValueConverter
  5. 【Fibonacci-PEG,LDPC】基于Fibonacci-PEG算法的LDPC码校验矩阵的构造
  6. 手挽手带你学React:三档 React-router4.x的使用
  7. zblock 结构_zfs raidz结构详解
  8. 什么是卷影复制,卷影服务是什么
  9. vs环境下C++dll生成和使用(基础篇)
  10. RocketMQ多Master多Slave模式部署
  11. Vue + webpack 项目配置化、接口请求统一管理
  12. java.util.Scanner简单应用
  13. oracle的exp和imp,oracle exp和imp
  14. VerbalExpressions
  15. C++调用.lib的方法
  16. Pulseaudio实用命令(二)
  17. 计算机c盘要满了电脑会卡吗,C盘满了 电脑卡顿了,怎么清理空间
  18. 中文计算机语言编程优势,十种编程语言特点比较
  19. cad计算机编程,CAD/CAM自动编程的步骤
  20. 华为一员工猝死出租屋 警方初步排除他杀

热门文章

  1. Vs2010中文版MSDN 安装方法
  2. H264/H265编码视频流媒体播放器EasyWasmPlayer.js控制台循环报错Unsupported排查
  3. 数字图像处理技术对军事与公安的帮助
  4. 关于CIE RGB色坐标图转换到CIE XYZ色坐标图
  5. 电视机芯片介绍-海思Hi3751 V600
  6. 将Table转换成HTML
  7. 企业管理系统可视化权限功能设计
  8. 我的桌面秀(ubuntu3d)
  9. 热血江湖群医外挂源代码研究
  10. 2019年中国公有云厂商发展状况白皮书