Система ролей и разрешений не-RBAC: проверка города пользователя - PullRequest
2 голосов
/ 15 мая 2010

В настоящее время мы проектируем a Система ролей и разрешений пользователей в нашем веб-приложении (ASP.NET), и, похоже, у нас есть несколько случаев , которые не подходит в рамках классического управления доступом на основе ролей (RBAC) . Я опубликую несколько вопросов, каждый из которых посвящен конкретному делу, это первый пост.

У нас есть следующий case : не разрешать пользователю просматривать определенную страницу, если пользователь живет в определенном городе. Это простой случай, который закодирован следующим образом:

if (User.City == “Moscow”)<br> // Allow the user to view the page.<br> else<br> // Do not allow the user to view this page.

Хотя этот случай очень прост и понятен, он не имеет ничего общего с RBAC.

В StackOverflow кто-то назвал это Контроль доступа на основе атрибутов .

В соответствии с классическим RBAC, кажется, что этот случай должен быть сконструирован так: ввести разрешение «Город, в котором живет человек» , это разрешение будет иметь собственность City. Затем создайте роль, добавьте к ней разрешение типа «Город = Москва» и назначьте роль пользователю. Выглядит крайне громоздким .

Вопрос допустимо ли вводить такие подходы, не относящиеся к RBAC, к нашей системе разрешений - это нарушает дизайн или нет?

Это может показаться примитивным вопросом, но мы обнаружили, что большинство приложений используют чистый RBAC, и мы начали думать, что мы можем делать что-то не так.

Спасибо.

1 Ответ

1 голос
/ 15 мая 2010

Это было бы неплохо для управления доступом на основе атрибутов. Однако, если вы не возражаете посмотреть на реализацию PHP, Zend Framework имеет контроль доступа на основе ролей, который использует утверждения для решения более особых случаев:

http://framework.zend.com/manual/en/zend.acl.advanced.html

Стандартное правило позволяет роли выполнять действие с ресурсом. Четвертый параметр позволяет применять правило только при соблюдении некоторых условий. В псевдокоде:

allow(member, view, page) // standard
allow(member, view, page, userLivesInMoscow) // assertion used

Утверждение - это объект, который передается пользователю. У него есть метод, который проверяет, выполнено ли утверждение:

interface Assertion
 bool public function assert()

class UserLivesIn implements Assertion
 public function UserLivesIn(User, City) ...
 // implementation of assert method comes here

Это способ реализации того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...