一种权限系统设计方案

📅 2026/7/17 12:37:46
一种权限系统设计方案
一些个人见解大家看看欢迎指正。设计一个权限系统的目的是为了回答“某人能不能做某事”的问题比如小A能不能修改这个广告的名字。因此一个权限系统只要能定义出所有受控操作并针对每个用户设置一次能或不能即可。大概看起来这个权限系统是这样的1、对所有可进行的操作进行分类有一部分是不需要进行控制的另外需要进行控制的操作每一种操作要对应到一种权限。为了避免设计复杂化这里可以放弃权限分级即所有权限都是等同的不存在包含和被包含关系2、每个人有默认权限3、设计修改权限的方法4、设计通用的验证权限的方法至此一个相对简单的权限控制系统就可以投入使用了。进一步的很有可能会遇到“数据权限”的问题。比如电影里经常出现FBI提供给别人看的文件上涂了黑杠杠。可以把黑杠杠看成是数据权限的一种表达。另外比如同样是仓库管理员但小A能管理a、b、c仓库但小B只能管理b仓库他们的数据权限也是不同的。那么在类似于刚才的权限系统中如何体现“数据权限”有一种相对简单的方法是利用“管辖权”的概念来处理。具体到小A和小B管理仓库的问题可以这样解决1、在权限系统中A、B都有“管理仓库”的权限2、在“数据权限“中A的管辖权包括了a、b、c而B只对b有管辖权通过以上两个正交的维度就定了一个完整的权限管理方法每个人能进行什么操作和每个人能管理哪些数据。现在来实现以上的内容。首先是定义”每个人能进行什么操作 “。由于只有”能“和”不能“所以很自然地想到用1bit来表达有多少种权限就需要多少bit。第二个问题是这个bit所处的位置要保证不同权限之间不重复。举个具体的例子一个很简单的系统共有8种权限分别是p1p2......p8首先我们为每个权限分配一个”值“permission value这个值用来代表权限所处的位置那么p1p8的值分别是0000000100000010000001000000100000010000001000000100000010000000对于每个用户而言要定义他的8种权限都是啥能/不能就需要用8bituser value。如果小a具有权限p1p4而没有权限p5p8则他的权限值就是00001111自然而然地对于权限的操作也就出来了a检测用户是否具有某种权限user value permission value结果转为无符号整数不为0则有权限b为用户增加一种权限new user valueold user value | permission valuec移除一个用户的某种权限new user vaueold user value (~permission value)实操中比如可以把每个user value存储在mysql中最长的数儿是bigint8字节可以表达64种权限。如果不够就用多个bigint。权限的定义和存储大概就是上面的方法了。下面再说说”数据权限“的问题。如前文用”管辖权“来表达即某个用户对某种数据能否进行操作。这个很简单。以仓库管理举例。a为每个用户分配一个uuidb为每个仓库分配一个uuidc设计一个对应关系表比如叫permission_scope字段为uuiduser_uuidtarget_uuidd检查某个用户是否能够管理某个仓库只要:select * from permission_scope where user_uuiduser‘s uuid and target_scopewahehouse’s uuid。结果集不为空则表示有管辖权。e移除某个用户对某个仓库的管辖权只要delete permission_scope where user_uuiduser‘s uuid and target_uuidwarehouse’s uuidf增加某个用户对某个仓库的管辖权INSERT INTO permisson_scope (user_uuid, target_uuid) VALUES (users uuid,warehouses uuid) ON DUPLICATE KEY UPDATE target_uuid VALUES(warehouses uuid);在以上的基础上可以扩展一下比如增加用户角色让分配权限更方便等等。