AleksandrB
@AleksandrB
Совсем недавно вывел "Hello world"

Как сделать кнопку доступной админу?

Есть страница, допустим, я обычный пользователь и зашел на эту стр, для меня не доступна кнопка "удалить запись", но если я введу определенные данные (логин и пароль) в форме для входа мне будет доступна эта самая кнопка.
  • Вопрос задан
  • 573 просмотра
Пригласить эксперта
Ответы на вопрос 1
@MadridianFox
Web-программист, многостаночник
Вам нужно для каждого пользователя хранить его роль. В простейшем случае вы можете хранить нолик или единичку - нолик это простой пользователь, единичка - админ.
Дальше, когда вы рендерите страницу, вы вывод кнопки обрамляете в условие - если у пользователя роль единичка, то показываем, иначе нет. Вот так:
<?if($user["admin"] == 1):?>
    <button>Delete record</button>
<?endif?>


Хотя единичка это самый тривиальный случай и чаще требуется создавать полноценную систему авторизации. Например концепция авторизации RBAC - работает с ролями и разрешениями. Есть список разрешений, например:

- создавать запись
- редактировать запись свою
- удалять запись свою
- редактировать любую запись
- удалять любую запись
- назначать пользователя модератором
- снимать с пользователя роль модератора

И есть набор ролей

- пользователь
- модератор
- админ

вполне очевидно, какая роль какими правами должна обладать. Но есть одна оссобенность, роли могут наследоваться. Т.е. модератор является так же и пользователем. А админ является модератором. Это логично. Поэтому вводится иерархия ролей.

Все эти данные о ролях мы конечно-же храним в БД. Итого имеем 3 таблицы:

- таблица прав
- таблица ролей
- таблица связи ролей и прав

Мы выделяем отдельную таблицу под связи ролей и прав т.к. одно право может быть у нескольких ролей, но и у каждой роли много своих прав.

Но мы не делаем отдельную таблицу для того чтобы связывать роли, т.к. каждая роль может иметь только одну родительскую роль.

В конце концов, мы должны прикрепить роль к пользователю. Мы можем разрешать пользователю иметь одну роль, или сразу несколько. И тут мы либо пишем id роли прямо в таблицу пользователя, либо делаем таблицу связи пользователей с ролями.

После этого пишем код, который будет отвечать на вопрос - имеет ли этот пользователь указанное право?
Этот код смотрит на его роль/роли, ищет в них такое право, если в них нет - то ищет в родительских ролях поднимаясь всё выше и выше по дереву ролей. Если дошёл до конца и права нет - сорян, тебе сюда нельзя.
<?if(hasPermission($user, "delete_any_record") or hasPermission($user, "delete_own_record")):?>
    <button>Delete record</button>
<?endif?>
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы