【问题标题】:How to store many items of data per SESSION?如何在每个 SESSION 中存储许多数据项?
【发布时间】: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 应用程序需要关注用户拥有什么权限,而不是他拥有什么角色。你同意吗?
  • 我很不同意。如果有权做出决定的人这样做,您的应用程序应确保执行该决定。

标签: coldfusion coldfusion-10


【解决方案1】:

这绝对可以。就我个人而言,我会创建一个结构,其中包含已默认为 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>

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果您担心内存使用 truefalse 所以它被存储为布尔值而不是整数。
    • 好点。您还可以进一步修剪它并进行一些位移以使用单个数值。例如cfset ... 项目异或状态
    • 你应该把它写成一个单独的答案
    【解决方案3】:

    您可以采用 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>
    

    【讨论】:

    • 在我的解决方案中,我只是测试是否存在。因此,如果 SESSION.Auth.UserRights.Note.Edit 存在,则意味着用户可以编辑任何 Note 对象。如果结构中没有 Edit 键,则表示他们没有此权限。它阻止我存储任何值......你怎么看?
    • 我认为页面上的任何解决方案都应该可以正常工作 - 我只是认为您担心会安装大量 SESSION 变量,因此尝试考虑最有效的存储方式。您可以只存储一个列表/项目数组来表示允许哪些操作 - “NoteEdit、NoteAdd”等。然后当您想要执行操作时搜索列表?有很多方法可以构建你想做的事情,我认为这只是个人喜好问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多