如何从零设计结构清晰、操作友好的权限管理模块

用户权限管理模块设计 最详细的,结构合理的,易扩展的,用户权限管理模块设计教程。 立即下载

前言


在开讲之前,先列举几个场景:

场景一

Hi,今天那个销售总监说要设立几个销售经理的职位,然后每个经理管理自己小组的销售员,我们把用户的销售数据按组分开来吧。

场景二

Mario,今天那个市场部的说要分立几个板块,公众号的管理所有文章投稿评论,推广管各平台宣传策略方案与实施,对,竞品的相关资料数据也要分立出来,我们要把这些分开来。之前讨论的销售部的事情和这个没关系哦。

场景三

那个,xx店的店主说,他管理的两家门店,想同时处理两家店的事情,需要兼顾两家的销售、采购的数据。人家提的需求场景有道理,你给他做一下吧,对了,不要影响其他店的管理哦!

场景四

今天总部的运营小x说,他们需要以门店、部门、单个用户的角度看所有的运营数据,给他们做一下吧,每天导 excel 要疯了。



开始


当我们谈及权限的时候,很容易想到在用户发起请求时,对接口做一层权限验证,或者是对数据库读写限制权限,简单粗暴。因为是以用户操作为出发点进行限制,所以我们在一个接口的 handler 中定义:


if not user in [‘xxx’, ‘yyy’, ‘zzz’]:

          return ‘has no permission!’


或者在处理数据模型的 model 层定义:


access_users  = [‘xxx’, ‘yyy’, ‘zzz’]


这样限制住了用户的操作行为。不过这个硬编码的形式简直惨不忍睹,今天加一个接口,我们在 handler 代码中来一段这个权限定义,明天另一个 handler 的权限变动了,我们再去改一下那个代码。你说写在一个装饰器中统一管理,ok,那么在添加、修改 handler 的同时,还要去找到对应的具有该权限的用户,在装饰器中进行相关定义。在一个产品不断迭代的情景下,这样是不能被接受的。所以我们有必要引入一个模型来规范化权限控制。



结构化管理


通过以上情景,我们很容易得到一种权限结构模型(参考 django)以 user(单一用户)、group(用户组)、permissions(单一权限)三层两两之间多对多的关系,实现了当用户请求接口 APIa,此时进行获取用户,获取用户所属组,获取所属组所具备的权限,若获取不到记录,则限制掉此次请求。运用这个模型,我们每次将 permissions 定义成:module、function 的形式,同时定义 request method 。这样将具有权限的 group 关联到一个 permission(即一个 handler)上。同时将用户关联到用户组,从而可以在不断变动权限的情况下,配置一次对应关系,将用户权限限制到单个 handler 上。



用 python 的同学知道,由于 python decorator @的语法糖,我们很喜欢用这种形式来处理这些与业务逻辑无关的代码,例如:日志记录、检查缓存、检查 user session等。有时候在一个方法装饰器写的像盖楼一样,稍不留神就忘记了。有时候开发者对项目不熟悉,在写一个新的接口之后,配置了权限,却忘记加装饰器,导致这部分一直没有被限制。


@route()

@login_required

@check_cache

@add_log

@permission_verify

@transaction.atomic

def interface_a():


所以在这里引入一个中间件,专门处理这个事情,不必每次增加额外代码。

中间件运行发生在后端 route dispatching 的时候,每次的请求我们根据请求的 session 找到 user、找到对应的 user group, 再找到 permissions,通过定义的具有权限 module function 与请求的 handler 比对,若不同则限制掉。


def permission_middleware():

    permissions =  request.get.user_permissions()

    if ‘{}_{}’.format(handler.__class__, handler.func_name) not in permissions:

        return permission_denied


这样后端限制逻辑比较结构化,节省了很多麻烦,方便修改和管理。同时具有较好的扩展性,我们将 user 定义为单一用户对象,将 permissions 看作单一 handler 对象,可以把所有门店、部门、小组、小群体等均划分到 group 一层 。几乎大部分的业务需求均可以对应实现。逻辑准确,嗯,很完美。



限制闭环,对象细化



第二天 PM 来了,说 xx 部门的小 x 讲他们部门里面的工作内容需要分类,(我在点头,心里想:嗯嗯,我给你们每一个分类加一个 group 配置 user 权限)一个工作分类有许多工作者,有一个管理者,管理者需要看所有工作者的工作进度,工作内容管理者也同样可以进行(心里想:嗯嗯,我再加一个管理者的 group 所有权限一样,单独加一个工作进度查看的权限)同时!1分类下的管理者,还可以看2、3工作分类下的小 y 小 z 的工作进度!(我心里想:what?这不科学吧)PM 继续说,因为他们工作要对接,是需要查看的功能(我想:那管理者不作分类不就好了,所有的内容都可以看)并不能全部看到!PM 接着说,他的主要工作还是本分类下的工作内容,只是查看一下其他分类下的几个人的进度,你不能给他把所有人的内容都展示出来吧,况且有些还是保密的。

这确实是一个问题,不仅仅是在这种特殊的情况,只要涉及到针对某一个用户,或者某一个具体内容做操作限制,就是实现不了的。经过辗转反侧,发现我们之前做的只是将权限限制在操作行为上,没有形成闭环,操作哪些对象没有定义。每一次限制默认是所有对象。这样虽然方便管理,但是有些场景不能满足需求。于是引入权限操作对象范围的概念:

在之前的 permissions 一层上加入:


1. 是否有对象粒度限制

2. 限制的哪个 model 的 object

3. 可操作的object id list。


由于这部分是对于数据过滤的处理,所以我们无法在中间件完成这个操作。将这部分放入数据处理层(DAO 层)进行过滤是个不错的主意。首先我们在数据处理方法中,在上下文获取本次请求的 user 对象,按老办法将他的 permissions 统统获取到,这时,按照我们预先定义的:是否有对象粒度限制进行判断,需要限制则根据当前处理的 model 过滤出操作的 object id list。这样在返回数据的时候,所有记录均为对其具有操作权限的对象。


object_id_list = request.user.permissions.get_object_id_list()

if need_limit_object and model == request.user.permissions.get_model:

        sql = ‘select * from model where id in {}’.format(tuple(object_id_list))

        return fetch_data(sql)


现在我们满足了所有(至少是目前为止所遇到的)业务需求,后续权限的所有需求也可以按照这个思路进行相关配置处理,并得以解决(美好的愿望^_^)。



前端限制提高体验


至此,我们开发工作会变得很愉快,逻辑清晰且结构严谨。与此同时,给 c 端用户的体验就是,哪里不会点哪里,点完哪里不给你。给一个美如画的页面或者是弹窗还算好的,跳个403、404或是500想必也见过。此时用户只有一句 mmp,什么破玩意不玩了。



所以,权限在前端预先限制势在必行,好在我们多数情况下用到了模版引擎,很方便的在页面上进行权限判断。在服务器端渲染页面的时候,根据当前请求的用户,获取到所有权限,在某一个 DOM 上简单随意的写上一句判断代码,将我们在中间件中匹配 handler 的过程放到模版渲染的过程,这样将没有权限的条目过滤掉,还用户一个清静的世界,同样可以避免点到不该点的东西。


{% if user.permissions.can_modify_xxx %}

<a href=”/modify_xxx/”>修改xxx</a>

{% endif %}


如果是在不用模版引擎的情况下,我们就需要在页面在浏览器渲染的时候,加一个 ajax 请求加载到用户的权限列表,用js后期去掩盖掉不该看到的东西。



前端组件化整理


这样极大程度的提高了用户体验,但是回顾一下我们的做法,编写一个新的功能,处理掉权限所有关系配置之后,需要根据这个 module function 字符串在页面上所有用到的地方写一句判断语句,这样非常麻烦。而且如果想要修改一个权限的定义,简直是灾难。为了解决这个问题,我们不得不借鉴一下组件化的设计模式,即模版复用。用模版引擎的继承、导入可以实现这个目的。当然 react 是天生的组件化设计理念。我们在一个最上级组件初始化的时候将该用户具有的权限列表从服务器端拉取,存储本地,然后依次向下流入到各级子组件中,每个组件配置一个 id(可以与 module function 字符串一致,也可以做一次映射)当组件在权限列表中找到自己的对应的 id 则进行渲染。最终整个页面根据权限列表将所有可以显示的部分全部渲染出来。



刚才提到的组件id这是前后端限制的关键,后端根据 module function 判断 handler 处理,前端根据 id 判断渲染与否,那么这个配置应该是前端写好组件由后端配置,还是后端提供配置权限入口,由前端自行配置呢?



前后端分工配合


当我们讨论开发模式的时候,总会遇到这样一个问题:

前后端分离还是不分离


  • 分离时前端工作量加重,路由、组件加载、部署等都要处理,有时候项目不是很大,这种分离得不偿失,但是好处是前后端各司其职,处理自己的部分,不会产生不必要的工作量。

  • 不分离的情况就是运用模版引擎,前端提供静态页面,服务器端渲染,这样有的时候在后端处理数据的同时可能将页面样式或者动画效果破坏掉,然后又要两端反复修改,好处是开发简单,一些功能简单且比较单一,可以直接一并处理。

无论分离还是不分离,提供一个配置服务这个中间产物是有必要的,分离时我们可以让前端在写好组件后,将自己的组件id配置在系统中,后端按照正常的限制逻辑进行。不分离时,直接根据前端页面的编写的 id 进行配置,这部分可以由后端完成。有了这个公共区的系统,想必大家都是很开心的,又能一起愉快的玩耍(coding)了。现在处理这个问题的开源项目有很多,比如基于 django admin、flask admin 等流行的后台管理项目,就可以很好的搭建这种定制化的公共配置部分。

当然,具体的设计结构需要根据系统需求作相应的变通,可能有些场景限制粒度无要求,我们可以不作操作对象的闭环,如果是权限严格要求的场景(Mario 遇到的场景)就显得有必要了。前端限制在追求用户体验的情况是有必要的,组件化会将结构理得非常清晰,同时工作量也有所增加。公共区的配置模块就像一个前后端的枢纽,或者说是一个契约,不仅是在权限限制上,在所有配合开发的场景都是有所帮助的。


Mario,岂安研发工程师

主要负责岂安 STALKER 项目的设计与研发工作,python 爱好者,对于 python 在 web 和自动化领域中有所探究。天生对用户体验至上的产品有极大的好感。梦想是将一切极 low 且繁杂的工作交给计算机或优雅地提供给他人处理。


权限设计(包括表结构) 本文档包括了强大的权限设计,里面是图文并茂.还有表结构,总共有16个表来支持的权限,适用范围大. 立即下载

相关推荐

权限管理模块的表结构设计

NULL 博文链接:https://felix-alone2012.iteye.com/blog/2088713

权限管理整个流程

涉及到权限管理的模块 用户管理: 账号的增删改查以外,为该账号分配角色 角色管理:角色的增删改查,为该角色分配权限数据 权限管理:需要进行权限管理的页面进行增删改查 权限管理分三部分 1.api 主要是后端处理 前端:响应拦截里做统一错误处理 2.路由 2.1将路由分为二大块 静态路由:不需要访问权限的路由(登录页,404,首页) 动态路由:需要权限访问的路由 默认只有静态路由 2.2在获取到用户信息后 1.用户信息中包含当前用户能访问的权限页面的数据 2.通过和动态路由匹配.

qing_bk的博客 1790

权限管理模块

权限管理分为四个模块: 1、模块的权限:对应的所有调用的method(action.method) 2、所有action的权限(action) 3、职称权限:对应N个action的权限+N个method权限(分开存储) 4、个人权限 = 职称权限 + N个action的权限+N个method权限 权限的作用范围:模块的权限 < action的权限 < 职称权限 < 个人权限

权限管理系统设计方案

用户和角色,角色和权限都是多对多的关系,这种模型是最通用的权限管理模型,节省了很大的权限维护成本, 但是实际的业务千变万化,权限管理的模型也需要根据不同的业务模型适当的调整,比如一个公司内部的组织架构是分层级的,层级越高权限越大,因为层级高的人不仅要拥有自己下属拥有的权限,二期还要有一些额外的权限。这种模型能够满足权限的基本分配能力,但是随着用户数量的增长,这种模型的弊端就凸显出来了,每一个用户都需要去分配权限,非常的浪费管理员的时间和精力,并且用户和权限杂乱的对应关系会给后期带来巨大的维护成本。

. 5896

经典的用户权限管理,数据结构分析设计

经典 用户权限管理 数据结构 分析设计经典 用户权限管理 数据结构 分析设计

pwm电机调速的原理介绍与代码实现

1、pwm实现调速的原理与介绍 PWM(Pulse Width Modulation)脉冲宽度调制。 1)占空比 pwm占空比就是一个脉冲周期内有效电平在整个周期所占的比例。 通过调节PWM的占空比就能调节IO口上电压的持续性变化,因此也能够控制外设的功率进行持续性变化,也就能控制直流电机的转速快慢。 那么重点就在于如何调节PWM波形的输出。如下图所示 图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4

Clichong 7万+

Java:72-项目的权限管理模块

项目的权限管理模块 在上一个博客中(71章博客),我们完成了广告管理模块和用户管理模块,接下来我们完成最后的权限管理模块 权限管理模块 : 权限概念介绍: 权限:权利(能做的)和限制(不能做的),在权限范围内做好自己的事情,不该看的不看,不该做的不做 认证: 验证用户名密码是否正确的过程 授权: 对用户所能访问的资源进行控制(动态显示菜单、url级别的权限控制) 为什么要实现权限系统 : 首先系统需要进行登陆才能访问 其次不同登陆用户要有不同的权利 而且要有不同的菜单(例如财务经理针对系统中财务相关模块进行

qq_59609098的博客 2643

2025.06.20【pacbio】|PB甲基化分析结果的统计与可视化介绍

本文介绍了PacBio甲基化数据的统计分析与可视化方法。主要内容包括:1) 分析甲基化位点分布、比例及染色体分布;2) 修饰基序(Motif)的统计与热图展示;3) 全基因组和局部区域测序深度可视化;4) 使用IGV查看单个reads修饰情况。文章提供了R代码示例,涵盖柱状图、分布图、热图等多种可视化形式,并建议了差异甲基化分析等进阶方法,帮助科研人员深入挖掘甲基化数据。

2066

谈谈如何设计一个友好的权限管理模块(上)

权限管理是很多管理系统常见的需求,说起来这是一个比较简单的功能,但是每个人在实现的时候,往往都是以满足自己的眼前需求为动机,不太考虑整体的设计,导致使用不友好,拓展不方便,甚至代码层面也是千奇百怪,使用各种方式的都有。 遥想几年前,我还是实习生的时候,实现自己的第一个权限方面的需求,采用的是将用户的角色存储在localStorage里面,然后前端代码根据这个角色来判断隐藏菜单栏和一些按钮。后端压...

liujiawei00的博客 361

ISCC-Amy‘s Code CTF-Reverse

ISCC-Amy's Code CTF-Reverse

m0_72904009的博客 682

数据分享|2023年OSM道路数据(全国,分省,分市)

首先这个工作非常有必要的,因为我们正常使用的道路的分类都是基于包括城市快速路、城市主干路、城市次干路这个体系的,大家对于这个分类体系应该更熟悉,但是OSM地图的道路分类又不是完全按这个来的,所以非常有必要重新分类;搞清楚道路类型是我们使用道路数据做很多工作的基础,比如我们在使用道路数据的时候,经常需要预估道路的行车速度,而这个速度一般就是根据道路类型来的,比如高架路的车速肯定就比城市支路快很多!下载分为两种情况,第一种是下载小区域的数据,比如下载一个街区的数据,第二种为下载整个中国范围的。

JData_Engineer的博客 4306

Java应用开发中权限管理核心模块设计及主流实现思路

权限管理是Java应用开发中绕不开的核心模块,它直接关系到系统的安全性和数据隐私。一个设计良好的权限系统,能够清晰界定不同用户能访问哪些资源、执行哪些操作,从而有效防止越权行为。

2509_93883429的博客 449

ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

方案二是在PS端的MPU配置中,将DMA缓冲区所在的内存区域标记为“不缓存”(Device或Strongly Ordered类型),但这样CPU访问这些内存区的速度会大幅降低,需要根据实时性和数据正确性的需求做权衡。更妙的是,描述符链表可以做成一个环状队列,放在DDR里让DMA循环取走,从而实现持续不断的“流式”传输。用FPGA实现FFT硬件加速的系统中也是如此:PS向PL提交待处理的FFT数据,PL硬件加速计算后,DMA把结果写回DDR,全程CPU几乎只做配置调度,大量数据吞吐留给了硬件通道。

QQ_778132974的博客 174

告别权限弹窗烦恼:Nativefier如何设计用户友好的权限请求UI

Nativefier是一款能将任何网页转换为桌面应用的强大工具,它通过精心设计的权限请求UI,有效解决了传统桌面应用中权限弹窗带来的用户体验问题。本文将深入探讨Nativefier如何打造既安全又友好的权限交互设计,帮助开发者和用户轻松应对权限管理挑战。 ## 为什么传统权限弹窗让用户烦恼? 在使用桌面应用时,我们经常会遇到各种突兀的权限请求弹窗。这些弹窗往往: - 打断用户当前操作流程 -

gitblog_01142的博客 1105

【实战】基于 Inner-IoU 的 YOLOv8 优化指南:显著提升检测精度

Inner-IoU 凭借辅助边框的创新设计,成功解决了传统 IoU 损失在小目标、遮挡场景下的收敛难题,为 YOLOv8 注入了更强的定位能力。从原理剖析到代码集成,本教程已为你铺就了一条“精度提升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“精度优异”的答卷——相信我,当你看到检测框精准贴合目标的那一刻,你会明白这份尝试的价值。

m0_64661770的博客 107

YOLOv8【第十章:多任务扩展深度篇·第18节】不规则工业缺陷分割——针对划痕、裂纹的 Seg 模型调优!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 3982

React Native权限申请终极指南:从零打造用户友好的移动应用 [特殊字符]

Create React Native App 是构建跨平台移动应用的最快速方式,它让你无需担心原生平台配置即可创建 iOS、Android 和 Web 应用。权限管理是移动应用开发中的核心环节,直接影响用户体验和应用商店审核通过率。本文将为你提供完整的 React Native 权限申请指南,帮助你轻松打造符合平台规范的移动应用。 ## 📱 为什么权限管理如此重要? 移动应用权限是用户隐私

gitblog_00770的博客 860

YoloV8优化:感受野注意力卷积运算(RFAConv),效果秒杀CBAM和CA等 | 即插即用系列

感受野注意力卷积运算(RFAConv),解决卷积块注意力模块(CBAM)和协调注意力模块(CA)只关注空间特征,不能完全解决卷积核参数共享的问题

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4264

Android权限管理的终极指南:XXPermissions模块化完整解决方案

XXPermissions是一款专为Android开发者打造的权限管理框架,完美适配Android 16及以上系统版本。它提供了模块化的完整解决方案,让开发者能够轻松处理各种权限申请场景,从简单的单个权限请求到复杂的特殊权限管理,都能通过简洁的API实现。无论是危险权限、特殊权限还是自定义权限,XXPermissions都能提供一致且可靠的处理方式,帮助开发者专注于业务逻辑而非权限适配细节。 #

gitblog_01192的博客 924

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

探索 `ngxpt`:一个强大的Angular权限管理框架

探索 ngxpt:一个强大的Angular权限管理框架 在Web应用开发中,权限管理和路由控制是不可或缺的部分。ngxpt 是一款专为Angular开发者设计的高效、灵活的权限管理框架。它通过提供简洁的API和丰富的特性,帮助我们轻松地实现复杂的权限控制需求。下面我们将深入探讨其技术原理、应用场景及独特优势。 项目简介 ngxpt,全称为“Ngx Permission & Token”,它...

gitblog_00029的博客 577

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

B端:权限管理,远非增删改查审,一文告诉你细节。

B端的权限管理是指针对企业内部员工或合作伙伴的权限控制和管理。这包括对员工或合作伙伴在企业内部系统、数据和资源的访问权限进行管理,以确保信息安全和合规性。权限管理通常涉及角色和权限分配、访问控制、审计和监控等方面。企业可以通过权限管理系统来管理和控制员工或合作伙伴的权限,以保护企业的机密信息和资源。

2401_82943878的博客 1685

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何从零构建可扩展的智能体框架:HelloAgents的设计哲学与实践指南

在智能体技术快速发展的今天,开发者面临着两种选择:依赖成熟的第三方框架,或是从底层开始构建自己的解决方案。HelloAgents项目提供了一个独特的视角——它不仅是开源教程,更是一个完整的智能体框架构建指南,帮助开发者从"使用者"转变为"构建者"。本文将深入探讨HelloAgents的设计理念、架构实现以及如何通过模块化设计构建可扩展的智能体系统。 ## 智能体框架的核心设计挑战 现代智能体开

gitblog_00386的博客 742

mvc mysql用户管理_一步一步Asp.Net MVC系列_权限管理数据库与ViewModel篇

在上一篇中我们讲了大致怎么搭建一个项目,以及一个项目的基本构架,这一次,我们讲解基本的权限管理思路.说道权限管理,相信大家都不太陌生,这个东西几乎什么系统都会涉及到,因此,抽出时间去思考,去研究复用的模块,架构,就是一个非常好的提升水平的方式,特别是对于我们这些学生来说,没有太多经验,更需要去研究这些东西来更多的掌握实战方面的技巧.数据库设计是一个几乎人人都要面对的一个话题,我就来讲,我的数据库设...

weixin_39759989的博客 154
上一篇: 手把手教你用Python爬虫煎蛋妹纸海量图片
下一篇: Jmeter简单介绍与搭配Jenkins实现自动化测试实践
bigsec
博客等级 码龄11年 56粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值