Использование проверки прав доступа Fusebox 5.5 в .cfm предохранителя - PullRequest
1 голос
/ 24 марта 2009

У меня есть стандартная настройка пользователя / роли, которая возвращает роли текущего пользователя в списке. Затем я использую атрибут 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?

Ответы [ 2 ]

2 голосов
/ 24 марта 2009

Не сравнивайте с истиной - это ненужная трата времени ...

<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, вы можете просто использовать его напрямую, вместо того, чтобы выполнять отдельные операции слиянием, но если у вас есть несколько XFA (особенно если они будут использоваться на нескольких страницах), тогда XFA будут fuseactions может помочь сохранить вещи в порядке.

0 голосов
/ 25 марта 2009

Не думайте, что это действительно часть работы Fusebox - определять доступ к блокам кода. Установка XFA каждый раз не очень гибкий стиль IMO.

Обычно я использую токены безопасности для ограничения доступа. Каждое имя fuseaction по умолчанию является токеном, другие пользовательские токены могут быть добавлены разработчиком. В вашем случае пользовательские токены должны быть «MainMenu» и «AdminMenu».

Я использую группы безопасности, поэтому разрешения fuseaction выглядят как «администраторы, участники». Это сопоставление безопасности по умолчанию для токена fuseaction, скажем «mycircuit.myfuseaction». Я храню карту доступа в базе данных, поэтому при первом использовании метки fuseaction и пользовательские токены вставляются в карту и могут быть изменены позже.

Для проверки доступа используется предоставленный простой метод (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 (предоставление, если не определено) и т. Д.

Надеюсь, это поможет.

...