如何按SESSION存储多项数据?

时间:2013-11-06 19:54:48

标签: coldfusion coldfusion-10

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

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

这意味着UserID'1'可以创建,编辑或删除Note对象。

我想要做的就是将这些权限存储在SESSION数组中,以便Web应用程序始终知道登录用户具有哪些权限。因此,当用户在我的applciation中查看Note对象时,将根据此用户拥有的权限提供正确的“创建”,“编辑”或“删除”选项。

应用程序需要知道用户有权使用哪个对象,然后才是正确的。某些用户可能没有权限期望只读。如何在ColdFusion结构中存储此Entity-Right键值对?

我到目前为止所做的就是:

<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 AND SESSION.UserRights.Note.Create例如

这可以吗?

3 个答案:

答案 0 :(得分:2)

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

原因是你可以只检查权限而不必检查存在等等。请注意你应该做一个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>

答案 1 :(得分: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>

然后你的所有测试都存在。

答案 2 :(得分:0)

您可以采用unix web server / CHMOD权限的方法。它们使用单​​个整数来表示给定用户可以执行的操作。

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

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

<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>