【问题标题】:Using Fusebox 5.5 permissions attribute checking within the .cfm of a fuse在 fuse 的 .cfm 中使用 Fusebox 5.5 权限属性检查
【发布时间】:2012-01-14 09:11:52
【问题描述】:

我有一个标准的用户/角色设置,它在列表中返回当前用户的角色。然后我使用 permissions="" 属性和 preFuseaction 阶段来检查这个用户是否被授权访问这个 fuseaction。这允许显示页面的某些块,并为不同的用户隐藏某些块。

我无法在更精细的级别上做同样的事情,即禁止在侧边栏中向没有权限的用户显示链接。说:

<ul>
   <li><a href="#xfa.mainmenu#>Main Menu</a></li>
   <li><a href="#xfa.adminmenu#>Admin Menu</a></li>
</ul>

管理员菜单应该只对具有“管理员”角色的用户可用。如果普通用户单击此链接,他们将无处可去,因为当 fuseaction 实际运行时,它会将他们踢出。我宁愿一开始就没有链接。

这可以通过将角色硬编码到 .cfm 文件中来完成,因此:

<ul>
   <li><a href="#xfa.mainmenu#>Main Menu</a></li>
   <cfif checkRole('admin') EQ TRUE><li><a href="#xfa.adminmenu#>Admin Menu</a></li></cfif>
</ul>

但是,如果可以查找在 circuit.xml 中定义的权限并将其传递给 checkRole()(可能通过传递 xfa?)而不是静态值,则会更优雅一些。 Fusebox 创建的结构可以做到这一点吗?

【问题讨论】:

    标签: coldfusion fusebox


    【解决方案1】:

    不要与真实比较 - 这是不必要的浪费时间......

    <cfif checkRole('admin') >...</cfif>
    


    但是,在显示文件中我会这样做:

    <cfif StructKeyExists( Xfa , 'AdminMenu' )>
        <li><a href="#xfa.adminmenu#>Admin Menu</a></li>
    </cfif>
    


    然后,在你的 circuit.xml 文件中,你可以这样做:

    <fuseaction name="Menu">
        <do action="NormalMenuLinks"/>
        <do action="AdminMenuLinks"/>
    
        ...
    
    </fuseaction>
    
    <fuseaction name="NormalMenuLinks">
        <xfa name="MainMenu" value="..."/>
    
    </fuseaction>
    
    <fuseaction name="AdminMenuLinks" permissions="admin">
        <xfa name="AdminMenu" value="..."/>
    
    </fuseaction>
    


    我并没有实际使用过FB权限,所以我不知道上面是否能按预期工作。

    如果没有,你可以这样做:

    <fuseaction name="Menu">
        <do action="NormalMenuLinks"/>
    
        <if condition="checkRole('admin')">
        <true>
            <do action="AdminMenuLinks"/>
        </true>
        </if>
    
        ...
    
    </fuseaction>
    


    这有点难看,但应该可以。

    当然,如果您只有一个 XFA,您可以直接使用它,而不是执行单独的 fuseactions,但是如果您有多个 XFA(特别是如果它们将在多个页面中使用),那么将 XFA 放入fuseactions 可以帮助保持整洁。

    【讨论】:

    • 谢谢,在初始测试中,第一个解决方案与权限配合得很好,我可能会将它放在一个函数中,以使用大量链接(例如 #navigationCheck("adminmenu"," Admin Menu")# 在检查结构后发回
    • ..)
    【解决方案2】:

    不要认为它真的是 Fusebox 工作的一部分——定义对代码块的访问。每次设置 XFA 并不是真正灵活的 IMO 风格。

    我通常使用安全令牌来限制访问。每个fuseaction名称默认为token,其他自定义token可由开发者添加。在您的情况下,自定义令牌应该是“MainMenu”和“AdminMenu”。

    我正在使用基于组的安全性,因此 fuseaction 权限看起来像“管理员、成员”。这是 fuseaction 令牌的默认安全映射,例如“mycircuit.myfuseaction”。我将 access map 保存在数据库中,所以 fuseaction 和自定义令牌在第一次使用时会被推送到 map 中,以后可以更改。

    使用简单方法(UDF)来检查访问权限('TokenName'),它将当前用户组(在您的情况下为角色)与令牌映射进行比较:

    <ul>
       <li><a href="#xfa.mainmenu#>Main Menu</a></li>
       <cfif granted('AdminMenu')><li><a href="#xfa.adminmenu#>Admin Menu</a></li></cfif>
    </ul>
    

    这种方式更加灵活,让您能够为不同的令牌组定义默认访问级别,在 STRICT(如果未定义则拒绝)和 LOOSE(如果未定义则授予)模式等之间切换。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签