有关权限和位运算的一点想法

没看海洋和另一个兄弟的设计。

我的想法是对资源应该有统一的ID,先甭管它是什么,真身是什么,存在哪个表里。

有的时候这样的设计不可得,这时可以考虑从权限角度讲,如何能有一种可用的、可扩展的资源定位的方式。

其次是对无差别资源条目的共同操作,可以被抽象和实现到一处。

可以参考的例子有很多(也说了很多遍),比如NTFS上文件管理的Access Control。

类似设计里面存在的一个疑问是,不同的资源操作可能不同,其实这只是一个约定和解释的问题。

这一点不比文件管理复杂,只有一些可以商榷的细节。比如,对于不同资源的不同操作,我们如何编码。

根据目标特征,特殊的编码方式一定会有其自身的好处,不过将会要求我们实现更复杂的动态翻译。

这种复杂将体现在CRUD以及更高层次操作的各个方面,所以还需谨慎。

和这种设计相关的一种具体实现是位运算这种方式,很多系统采用这种方式是有道理的,为什么呢?

我倒是不太赞成说位运算的实现能快多少,即便差别有几十倍几百倍,但至少不是指数级的差距。

(非说效率的话,关键是不同的问题交织在一起时,权限验证所花费的时间是如何被放大的,这个很看具体场景。)

主要是,它通过重新利用废掉的bit,纯粹降低了复杂度(trick本身是好理解的);而且没有真正产生Trade Off。

我们可以考虑,一个xx位的数据,其中大多数bit可能是对当前要验证的(用户、数据、操作)元组没有用的。

这本来是一种冗余,将会带来空间和运行时间的浪费,但这被计算机本身的特点避免了:没有冗余也需要相同代价。

冗余发挥的作用显而易见,一个运算代替了所有的其它设计可能存在的复杂实现,这里就不多说了。

一个讨厌之处在于限制,一个int值有32个位置,long有64个,可权限却可能更多,尤其是每种资源操作不同。

有时候我可以考虑重用位置,比如第二位在资源A上表示一种操作,资源B上表示另一种。

当然这又重新带来了复杂度,比如要求设计时避免将来可能产生的重叠和不一致,需要小心维护它们。

(考虑这将导致对于同一用户,两种资源的两个不同操作权限只能是同步的)

实际上这是因为受限于持久层软件的能力才产生的。可想如果持久层是自己的,那自由度就高很多。

很遗憾这不太可能,尤其是权限系统的独立也不太可能(因为总会存在联合操作的需求,比如某种查询)。

那么使用更大位数的字段或者更多的相同类型的字段(根据数据库软件的特性选择),是一个替代共享的方案吗?

我觉得行,但是没有时间和机会去验证这个。

有一点是可以确定的,即便是1024种操作也不过是32个int,数据量的控制还是不错的。

当然,还有一种方式是干脆用更多的连接表来展开用户、组、资源、操作之间的全部关系,这在关系模型的能力之内。

或者结合设计:对于(资源类别、用户)对,有一个唯一对应的bit组或其他编码形式说明各个操作。

我觉得具体的做法还是需要根据项目来,这似乎是废话,不过实际上思路也是有限几种。

无论是整体设计还是细节,恐怕都不能统一到某一种绝对占上风的方式上,不过还是有些建设性的探索工作可以做。

这就是找出不同的方式和不同场景其特征之间的对应关系。

这才是重用的基础。至于标榜某种做法“优胜”,或者是仅简简单单的说它“够用”,个人不敢苟同。

一些想法,欢迎大家讨论。

posted on   怪怪  阅读(1856)  评论(3编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器

导航

< 2009年6月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11
点击右上角即可分享
微信分享提示