Я работаю над реализацией класса для управления разрешениями пользователей на моем веб-сайте.
Например: сотрудники могут просматривать записи о клиентах, но ничего больше, работодатели могут просматривать клиентов, а также управлять сотрудниками, а администраторы могут делать и то, и другое, а также управлять работодателями.
Пока что у меня есть следующее:
Я сохранил список разрешений, например
addCustomer
,delCustomer
и т. Д. Каждое разрешение связано со списком ролей пользователей, которым разрешено выполнять это действие.У меня есть простой класс разрешений. Я использую это примерно так:
if ($ permissions-> can ('addCustomer')) echo «Добавить клиента»; else echo 'Не разрешено добавлять клиентов';
Однако сложность в том, что в некоторых местах мне нужно быть более конкретным. Например: у клиента есть разрешение: readMsgs
, которое позволяет ему читать сообщения между собой и сотрудником. Однако, если у него есть это разрешение, он может просто изменить URL-адрес с:
site.com/messages/read/100
to
site.com/messages/read/101
И также прочтите сообщение №101, которое может быть между другим клиентом и сотрудником. Клиент не должен иметь возможность читать чьи-либо сообщения, кроме себя.
Точно так же клиент получил editCustomer
разрешение, которое позволяет ему редактировать свой профиль, перейдя по ссылке:
site.com/customers/99
(где 99 - его идентификатор клиента)
Но если он перейдет на site.com/customers/100
Ему нельзя разрешать доступ к этой странице.
Как я могу решить эту проблему? В идеале я хотел бы передать идентификатор классу разрешений. Например:
if (! $permissions->can('readMsg', $msgId))
echo 'not allowed';
if (! $permissions->can('editCustomer', $requestedCustomerId))
echo 'not allowed';
Любые идеи, как мне пришлось бы реструктурировать структуру моего класса, чтобы разрешить вышеупомянутые вещи?