4

我有一个名为“rsUserRights”的查询,它返回如下用户权限:

UserID | Entity | Right
-----------------------
1        Note     Create
1        Note     Edit
1        Note     Delete

这意味着 UserID '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 例如

这个可以吗??

4

3 回答 3

2

那绝对可以。就我个人而言,我会创建一个结构,其中包含已经默认为 false 的权限,然后在登录更新时为匹配的权限更新为 true。

原因是您可以只检查 perms 而不必检查存在等。请注意,您应该执行 cflock 但我将在此示例中忽略它。

<cfset SESSION.Auth.UserRights = {}>
<cfloop index="AuthRight" list="Note,User,Documents,Application,SomethingElse">
  <cfset SESSION.Auth.UserRights[AuthRight]={Create=false,Edit=false,Delete=false}>
</cfloop>

<cfloop query="rsUserRights">
  <cfset SESSION.Auth.UserRights[rsUserRights.Entity][rsUserRights.Right]=true>
</cfloop>
于 2013-11-06T20:26:56.017 回答
1

如果您担心这将占用多少内存,那么与其将大量错误加载到您的结构中,不如仅在为真时加载。

<cfset SESSION.Auth.UserRights = {}>
<cfloop query="rsUserRights">
   <cfset SESSION.Auth.UserRights[Entity] ={}>

   <cfif Right EQ 1>
      <cfif SESSION.Auth.UserRights[Entity][Right] = true>
   </cfif>
</cfloop>

那么你所有的测试都是存在的。

于 2013-11-06T21:12:58.800 回答
0

您可以采用 unix Web 服务器/CHMOD 权限所具有的方法。他们使用单个整数来表示给定用户可能执行的操作。

http://www.zzee.com/solutions/unix-permissions.shtml

您可以调整编号以匹配您的应用程序可能具有的特定操作 - 例如,您可能有 1 = 仅添加,2 = 仅添加和编辑,3 = 完全添加、编辑和删除。然后对于用户来说,您的应用程序中的每种类型的对象只需一个数字条目。您的代码可能如下所示:

<cfset SESSION.Auth.UserRights = structNew()>
<cfset SESSION.Auth.UserRights.Note = 3>
<cfset SESSION.Auth.UserRights.User = 1>
<cfset SESSION.Auth.UserRights.Image = 2>

检查用户是否具有正确的权限然后涉及一些简单的逻辑 - 取决于您执行的操作以及您如何组织编号。像这样的东西:

<cfif SESSION.Auth.UserRights.Image GT 2>…
<cfif SESSION.Auth.UserRights.Note EQ 1>

如果您真的很担心空间(我不会),那么您可以将这些整数存储在单个列表/数组中,并检查特定位置的整数 - 但这可能很难跟踪为您的应用程序不断发展。

<cfset SESSION.Auth.UserRights = "3,1,2,3">
<cfdump var="#listToArray(SESSION.Auth.UserRights)#">
<cfoutput>#listToArray(SESSION.Auth.UserRights)[1]#</cfoutput>
于 2013-11-07T11:10:21.397 回答