我有一个包含不同类型权限的应用程序。如(角色基础安全性)RBC中所述,我将用户分组为角色并为角色分配不同的权限。 (和权限是这种风格:
public enum Permission {
View = 1,
Create =2,
Edit =4,
Delete =8,
Print = 16
}
在简单系统中一切正常,但当系统变得有点复杂时,系统会有特定的权限,例如:
正如您所看到的那样,系统中出现了不同类型的权限(它可以增长到大约200个不同的权限)。所以问题是:
在这种情况下你有什么想法?
提前感谢: - )
答案 0 :(得分:1)
我不确定为什么你觉得你需要尝试将所有权限推送到单个标志(或者我从vales推断)enum。权限请求和授权可以使用列表表示,而不是单个ORed值。如果您使用列表方法,则可以自由创建您喜欢的任何权限表示。例如,您可以使用非标记枚举甚至多个枚举来表示您的权限。
答案 1 :(得分:1)
听起来你需要一定程度的间接......
例如,您需要一个代表“他发行的发票”的类别(由对象代表)。您需要一种方法来授予角色对该对象的任何基本权限。您需要一种方法来测试某些东西是否属于该类别的成员。
假设“Jane”尝试查看发票。然后您只需要检查:Jane是否具有对此发票所属的某些类别具有“查看”权限的角色?
此检查可能很慢,因为您必须针对所有发票类别检查所有Jane的角色。但是大概你可以缓存结果......或者你可以使用“基于功能”的方法,其中Jane要求安全管理器获取具有View访问权限的发票的句柄(指针)。安全管理器执行检查并向Jane递出句柄,之后她可以使用该句柄执行句柄支持的任何查看操作,而无需额外的安全检查。
答案 2 :(得分:1)
我同意Nicole的看法,看起来你表现得似乎是一个很好的优化,但你遇到了规模问题。
许多RBC系统处理大量权限,这是角色存在的一个原因 - 常规用户只需知道他们所处的角色 - 让开发人员知道角色权限映射。较大的系统可能为超级用户提供GUI来执行角色权限映射,甚至创建权限,但仅为超级用户提供最大的灵活性。
然而,由于J2EE,在代码级别,它都归结为以编程方式检查“角色”。当您真正想要测试的是执行操作的权限时,这往往会使事情变得混乱。请记住这个语义差距。
在优化方面,不要考虑权限分配的方法,而是考虑何时以及如何执行检查。在Web应用程序中,您可能只需要检查来自前端的呼叫何时进入,并且网络延迟可能会使您在此处执行的任何优化都相形见。
如果您确定仍想进行优化,您可能会发现只需在登录时缓存权限即可。实际搜索权限将全部在内存中,因此在从数据库初始加载后会很小。
为了避免权限的组合爆炸,请事先建立一些强大的逻辑 - 写下来 - 并确保覆盖所有基础。如果您发现需要创建新的动态权限,例如将新实体添加到系统中,请注意 - 最好在中介或管理器模式中完成,这可以在分发受保护之前检查您的业务规则实体。在这里,您将进入像Drools这样的库的领域,这些库用于从您的应用程序中公开业务逻辑,以便根据不断变化的业务需求对其进行更新。