Как сделать доступность метода контроллера (mvc) для разных пользователей?

Как сделать доступность метода контроллера (mvc) для разных пользователей?

То есть человек авторизовался, определяется его тип admin или user. Админу доступны те методы контроллера которые недоступны обычному пользователю. Как бы это сделать грамотно?

Мне только думается сделать так:
1 Методы контроллера заносят данные о доступности этого метода в переменную класса.
2 В классе определен privat метод проверки данных о доступности вызываемого метода контроллера и типа пользователя. Тип пользователя в SESSION.
3 Этот privat метод вызывается в конструкторе супер-класса контроллера.
В случае если тип пользователя например user а вызывается метод админа, скрипт завершается ошибкой.

По идее, должно работать, и будет безопасно. Но что-то мне подсказывает... что это не совсем правильно. Как лучше сделать?
  • Вопрос задан
  • 2416 просмотров
Решения вопроса 1
akubintsev
@akubintsev
Опытный backend разработчик
Одна из реализаций это создание группы объектов, отвечающих за проверку прав доступа.
Назовём его PermissionManager. В этот менеджер можно добавлять группы объектов Permission* , реализующие интерфейс с методами hasPermission($object, $user, $method) и hasPermissionToСlass($className, $user, $method), и соответствующие по названию проверяемому объекту/классу.

Первый используется для проверки доступа к существующему объекту.
Второй имеет обычно более высокий приоритет, чем первый при проверке доступа и отвечает за возможность создания объекта с указанным названием или возможностью пользователю просматривать класс в принципе, без зависимости от его содержания.

Соответственно, используя такой механизм можно обратиться к PermissionManager (его разумно в DI-контейнер помещать) из метода вашего контроллера и проверять права пользователя на то, что вам нужно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
arutyunov
@arutyunov
Mooza.ru — Делаем сайты
Посмотрите, как это реализовано в популярных фреймворках. Например, в yii в самом контроллере прописываются доступы к методам для каждой категории посетителей - гости, юзеры, админы и т.д (yii access rules).
Ответ написан
Комментировать
Quber
@Quber
PHP Team lead
Мммм... я бы тут применил целую серию скриптов.

1. Установил composer.phar
2. Подключил бы автозагрузчик классов Symfony/Component/ClassLoader
3. Затем подключил бы компонент безопасности Symfony/Component/Security
4. Потом подключил бы компонент для чтения аннотаций
5. Подключил бы компонент управления пользователями FriendsOfSymfony/FOSUserBundle
6. Затем подключил бы SensioFrameworkExtraBundle
7. Админу дал бы права ROLE_ADMIN, а пользователь по умолчаниюю имеет ROLE_USER (спасибо FOSUserBundle).
8. Потом с помощью такой конструкции защитил бы функцию:
/**
 * security("has_role('ROLE_ADMIN')")
 */
public function admin()
{
    // somethink
}

/**
 * security("has_role('ROLE_USER')")
 */
public function user()
{
    // somethink
}

или целый класс
/**
 * security("has_role('ROLE_ADMIN')")
 */
class Test
{
    // somethink
}


Конечно для Вашего случая видимо это будет сложно и громоздко для одной операции. Но после Symfony, по другому я мыслить не могу. Мне кажется это вообще best practice какой только может быть.

Хотя в моём варианте, легче Symfony уже накатить, чем это всё делать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы