Как вы разрешаете разрешения внутри веб-страницы на уровне контроля в веб-приложениях? - PullRequest
1 голос
/ 14 августа 2011

Я часто сталкиваюсь с клиентами, которые запрашивают разрешения на уровне управления в веб-приложениях.Таким образом, одна роль может «Создать» и «Обновить», а другая роль может только «Обновить».Теперь это не является реальной проблемой безопасности, большинство структур веб-безопасности используют фильтры и могут контролировать различные действия в веб-приложении.Поскольку каждая кнопка запускает свое действие, вы можете запретить пользователю вызывать действие, которое он не должен выполнять.

Настоящая проблема на визуальном уровне.Пока неправильная кнопка видна, он будет получать сообщение «Несанкционированная операция».Мне нужно показать разные подмножества элементов управления для разных пользователей в зависимости от его разрешений.Сейчас я обычно создаю отдельную страницу для отдельного профиля, но это подразумевает много дублирования.Существуют ли какие-либо веб-фреймворки (независимо от технологии), которые решают эту проблему?

Ответы [ 4 ]

1 голос
/ 22 августа 2011

Большинство фреймворков должны позволять вам запрашивать у пользователя разрешения (возможности, что угодно) при рендеринге, даже из шаблонов. Как это:

<*pseudocode* if EditPermission.providedBy(user) >
    <button ...EDIT... />
<*pseudocode* end>
0 голосов
/ 23 августа 2011

У меня тоже была проблема, и я решил ее с помощью Zend Framework . Вам не обязательно использовать саму полную платформу Framework, но вы можете полагаться на Zend_Acl - часть авторизации платформы.

Вы в основном определяете иерархию ролей и разрешенные / запрещенные действия для каждой роли, как вы, возможно, уже знаете из других структур:

$acl = new Zend_Acl();

// two roles
$acl->addRole(new Zend_Acl_Role('moderator'))
    ->addRole(new Zend_Acl_Role('member'));

// a Resource is something you can map actions to
$acl->addResource(new Zend_Acl_Resource('database'))
    ->addResource(new Zend_Acl_Resource('database'), 'update');

// now for the acls itself
$acl->allow('moderator', 'database', 'update')
    ->deny('member', 'database', 'update');

Если вы знаете, хотите показать или скрыть действие в зависимости от роли, это так же просто, как использовать isAllowed() -метод в вашем коде:

// show button?
if ($acl->isAllowed($user->role, 'database', 'update')
    echo '<input type="button" value="update" />';
else
    echo '<input type="button" value="update" disabled="disabled" />';

Страница справочника позволяет лучше понять Zend_ACL () и Zend_Auth () - последняя обеспечивает аутентификацию. Если вы также хотите еще больше автоматизировать создание пунктов меню в соответствии с ролями, проверьте также Zend_Navigation .

0 голосов
/ 20 августа 2011

Я использовал несколько MVC-фреймворков в Perl и PHP, и они работали одинаково: они оставляют вас свободными для создания ваших представлений так, как вам нравится.Но ни один из них не рекомендует использовать разные представления для разных ролей.Поскольку роли обычно представляют собой группы разрешений, создание отдельных представлений предотвратит любое создание или изменение ролей.Таким образом, фреймворки рекомендуют создать одно уникальное представление и проверить разрешение в представлении так же, как в контроллере.Это также позволяет избежать дублирования, хотя представления являются более сложными.

Несколько примеров в PHP: lingua franca :

  1. Symfony (ACL)

    // Это должно быть в контроллере $ securityContext = $ this-> get ('security.context');// В представлении перед добавлением кнопки «Обновить» if (false === $ securityContext-> isGranted ('EDIT', $ stuff)) {// ...

  2. Yii (RBAC)

    // в представлении if (Yii :: app () -> user-> checkAccess ('create')) {echo $ form-> linkButton (...);}if (Yii :: app () -> user-> checkAccess ('update') || Yii :: app () -> user-> checkAccess ('updateOwn', $ stuff)) {

Обратите внимание, что многие компоненты, особенно формы, обычно не создаются непосредственно в HTML. Поэтому отключение некоторых элементов в соответствии с разрешениями проще, чем в шаблонах.

0 голосов
/ 15 августа 2011

Я думаю, что большинство фреймворков, основанных на паттерне MVC, позволят вам иметь разные представления для разных ролей.Поскольку код отделен от View, проще использовать эту логику в разных местах и ​​ситуациях.Попытка сделать это в приложении в стиле веб-форм приведет к значительному дублированию, поскольку код, выполняющий страницу, более тесно связан со страницей.

Если вы находитесь в ситуации с веб-формами, вместо дублирования страниц выможет иметь элементы управления (или действия) в матрице с ролями пользователей, показывающими, какие элементы управления доступны для каких ролей.Когда страница загружается, вы скрываете / отображаете или включаете / отключаете элементы управления на основе того, что находится в матрице для роли пользователя.

...