zoukankan      html  css  js  c++  java
  • 有关权限和位运算的一点想法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    正则表达式
    js trim函数 去空格函数与正则集锦
    变量的作用域问题
    for...in 语句
    JS小案例分析
    JS动态创建元素的方式
    JS类的封装
    js操作节点小结
    节点兼容
    节点小结
  • 原文地址:https://www.cnblogs.com/guaiguai/p/1503944.html
Copyright © 2011-2022 走看看