【发布时间】:2013-11-08 21:31:55
【问题描述】:
我有一个名为“rsUserRights”的查询,它返回如下用户权限:
UserID | Entity | Right
-----------------------
1 Note Create
1 Note Edit
1 Note Delete
这意味着用户 ID“1”可以创建、编辑或删除 Note 对象。
我想做的只是将这些权限存储在一个 SESSION 数组中,以便 Web 应用程序始终知道登录用户拥有什么权限。因此,当用户在我的应用程序中查看注释对象时,创建、编辑或删除的正确选项将可用,具体取决于该用户拥有的权限。
应用程序需要知道用户有权访问什么对象,然后该权限是什么。某些用户可能没有只读权限。如何将这个 Entity-Right 键值对存储在 ColdFusion 结构中?
到目前为止,我所做的只是:
<cfset SESSION.Auth.UserRights = StructNew()>
<cfloop query="rsUserRights">
<cfset SESSION.Auth.UserRights.#rsUserRights.Entity#>
<cfset SESSION.Auth.UserRights.#rsUserRights.Entity#.#rsUserRights.Right#>
</cfloop>
上述方法可行吗?然后使用 structkeyexits 来查找值对?我可以看到的问题是我最终可能会减少 SESSION 变量的负载,因为用户可能对数百个实体/对象拥有数百个权限。因此它会创建数百个 SESSION 变量并使我的服务器崩溃?
第一次尝试解决方案
<cfset SESSION.Auth.UserRights = StructNew()>
<cfloop query="rsUserRights">
<cfset SESSION.Auth.UserRights[rsUserRights.Entity][rsUserRights.Right] = StructNew()>
</cfloop>
然后在我的 CFM 页面中,我测试是否存在 SESSION.Auth.UserRights.Note 和 SESSION.UserRights.Note.Create 例如
这样好吗??
【问题讨论】:
-
您是否真的尝试过使用该代码?如果不是,为什么不呢?如果是这样,究竟是什么没有按您的预期工作?
-
我还没试过。我只是认为它太基础了,不能健壮和可扩展。如果用户权限表大量增长,我担心它会导致服务器在未来耗尽内存,我认为它会
-
鉴于您担心每个用户的权限过多,请查看角色。它可能会简化事情并占用更少的 RAM。
-
我添加了角色...但是只要管理员愿意,角色的权限就会发生变化。例如,他们可能会突然从经理角色中删除创建注释的权限。因此,我的 Web 应用程序需要关注用户拥有什么权限,而不是他拥有什么角色。你同意吗?
-
我很不同意。如果有权做出决定的人这样做,您的应用程序应确保执行该决定。