Как правильно управлять правами пользователя на PHP?


Я читал о ACL (списки управления доступом) , но я не понимаю, какой смысл использовать его больше, чем a пирамидальный способ мышления. (Контролер-администратор распространяется модератор, который распространяется пользователей).

Как лучше всего это сделать? Это плохая практика, чтобы стек расширяется?

2 3

2 ответа:

Во-первых, аутентификация.

Это просто вход в систему и утверждение, что комбинации username / password связаны с пользователем X.

Во-вторых, авторизация.

Во-вторых, как правило, там, где все может стать более сложным. Но для большинства случаев использования ваше общее понимание прекрасно. Такие пакеты, как Zend\Rbac или Zend\Acl, являются хорошей отправной точкой для реализации авторизации в логике вашего домена. Я предпочитаю RBAC, потому что есть более сложные реализации его. Читайте об этом для более тонких подходов.

В rbac пользователь имеет роль (admin), которая может наследовать от модератора, который также может наследовать от пользователя. В rbac роль уполномочена делать что-то, а не идентичность (user / principal на других языках). Где все может усложниться, когда вы разрешаете редактирование комментариев. Только владелец может редактировать свои собственные комментарии (per-entity rules). Но модератор может редактировать или удалять любые комментарии.

В приведенном выше пакете я использую специально написанный утверждение для разрешений на каждую сущность, поскольку это очень простой способ обработки этого в этом пакете. Или у вас может быть пользователь, который является администратором клиента X ... но это не означает, что он является администратором клиента Y. поэтому ваши правила могут быть довольно вовлечены за пределами простой иерархии.

В этих случаях каждый пользователь, вероятно, будет иметь много ко многим отношениям с клиентами и связанными ролями для каждого из них.

Ваш isAllowed метод должен был бы проверить на основе бизнес-критерии для этого. И это специфично для вашего домена - вот почему стратегии авторизации довольно сильно различаются от проекта к проекту. Обычно это происходит, когда вещи становятся сложными. В противном случае, в большинстве случаев разрешения действительно не слишком сложны, чтобы понять.

Укладка расширений никогда не является проблемой, если объекты принадлежат друг другу и имеют родительскую "ценность". Так что админ -> модератор -> пользователь -> анонимно -> пользователей отлично подходит для наслоения авторизации.

Но, как уже упоминал Джулио, реализации этого широко и широко различаются в нескольких проектах, можно использовать пакеты или свернуть свои собственные (если они знают, что делают, в противном случае гораздо безопаснее пойти на уже существующие пакеты, такие как упомянутые выше)