MiiZZo
@MiiZZo
JavaScript, React, NodeJS, Student

Как реализовать создание пользователей с не базовой ролью в приложении с RBAC?

Во всех материалах, которые я нашел в ходе поиска ответа на вопрос, я встречал одно и тоже: показано, как создать express-middleware, который выступает в качестве role-guard, вообщем, все довольно примитивно и везде user с не базовым набором доступа создается так же, как base user, мол есть route auth/register и auth/register-admin. Сейчас, у меня отсутствует понимание того, как же все таки в действительно нужно создавать админов, модераторов и т.д. Буду очень признателен за наделение меня нужными знаниями для понимания, спасибо!
  • Вопрос задан
  • 208 просмотров
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
пользователи с не базовой ролью очевидно не могут сами себя зарегистрировать, и создавать их должны другие пользователи у кого есть такое право.

вызов auth/register доступен всем, создается прользователь с обычной ролью, на вызов auth/register-admin уже стоят права доступа и этот эндпоинт могут вызывать только те кто имеет право (и это правильнее назвать не register-*, а create-*), он создает пользователя с соответстующей ролью вместо базовой.

вариантов по сути два - либо пользователь себя регистрирует с базовой ролью, и его потом "повышают" те у кого на это есть право, либо его создают заранее сразу с нужными ролями те у кого есть такое право.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
IgorPI
@IgorPI
Я тоже сейчас работаю с RBAC но только в Symfony
Все сводится к тому, что в тех или иных методах вызваться некая функция, которая проверяет наличие атрибута разрешающего доступ.

Только в Symfony есть так называемое голосование. (Voters)

Приведу пример:
<?php


namespace App\Security\Administrator\Voter;


use App\Entity\User;
use App\Entity\UserGroup;
use Exception;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;

/**
 * Class UserVoter
 * @package App\Security\Administrator\Voters
 */
class UserVoter extends Voter implements IVoter
{

    public const CREATE_USERS = 'create_users';
    public const EDIT_USERS = 'edit_users';
    public const DELETE_USERS = 'delete_users';
    public const VIEW_USERS = 'view_users';
    public const VIEW_CONTACTS = 'view_contacts';
    public const SET_PRIVILEGES_USERS = 'set_privileges_users';


    /**
     * @param string $attribute
     * @param mixed $subject
     * @return bool
     */
    protected function supports($attribute, $subject)
    {
        if (!in_array($attribute, $this->getAttributes())) {
            return false;
        }

        return true;
    }


    /**
     * @param string $attribute
     * @param mixed $subject
     * @param TokenInterface $token
     * @return bool
     */
    protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
    {
        $user = $token->getUser();

        if (!$user instanceof User) {
            return false;
        }

        $permissions = [];
        try {
            if (is_a($user->getGroup(), UserGroup::class)) {
                $permissions = $user->getGroup()->getPermissions();
            }

            foreach ($permissions as $permission) {
                if (in_array($permission, $this->getAttributes())) {
                    return true;
                }
            }

            return false;
        }catch (Exception $exception) {
            return false;
        }
    }


    /**
     * @return string[]
     */
    public function getAttributes()
    {
        return [
            self::CREATE_USERS,
            self::EDIT_USERS,
            self::DELETE_USERS,
            self::VIEW_USERS,
            self::VIEW_CONTACTS,
            self::SET_PRIVILEGES_USERS
        ];
    }
}


В контроллере
...
$this->denyAccessUnlessGranted(UserVoter::CREATE_USERS, null, "Вам запрещено создавать пользователей.");
...


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

Базовый атрибут это например строка в базе "user"
У каждого юзера гарантировано должен быть базовый аттрибут иначе доступа не будет.

Это не ответ, я делюсь своим опытом.
Ответ написан
Ваш ответ на вопрос

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

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