Реализация системы авторизации, в которой каждое отдельное конкретное разрешение дает доступ к определенному столбцу в Laravel. - PullRequest
0 голосов
/ 02 апреля 2019

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

Например, есть разрешение users.show.name_of_example_column, котороедолжен иметь доступ к столбцу name_of_example_column в users таблице.

Spatie / Laravel-Permission отвечает за ассоциирование пользователей с разрешениями и ролями в моем API.

Пользователи в моей системе имеют 2 разрешения:

  • users.show.id

  • users.show.name

Администраторы имеют все разрешения.

Я уже сделал пример, чтобы показать вам, какой результат я хочу (в зависимости от моей роли).

public function index($perPage = 30)
{
   $user = Auth::User();
   $fields = [];
   if($user->hasPermissionTo('users.show.id')) {
       $fields[] = 'id';
   }
   if($user->hasPermissionTo('users.show.name')) {
       $fields[] = 'name';
   }
   if($user->hasPermissionTo('users.show.email')) {
       $fields[] = 'email';
   }
   return User::Select($fields)->paginate($perPage);
}

Конечно,этот пример плохая практика.Должен ли я сделать это в модели пользователя через аксессоры или, может быть, где-то еще?Какой правильный путь?Есть идеи?

ОБНОВЛЕНИЕ

Я пытался проверить разрешение в средствах доступа

Вот пример

public function getEmailAttribute($value)
{
   if(Auth::User()->hasPermissionTo('users.show.email')) {
     return $value;
   }
   return false;
}

но когда этовозвращает false, это не отменяет (удаляет) атрибут 'email' из коллекции.Он просто заменяет исходное значение на «ложь».

1 Ответ

0 голосов
/ 05 апреля 2019

Средства доступа нельзя использовать для сокрытия атрибутов модели, вам скорее нужно пометить эти выбранные атрибуты как скрытые l

Поэтому добавьте в вашу модель универсальный метод, который будет делать это скрытие для вас на основеуровни разрешений

public function marker()
{

    // loop over the attributes 

    // check permission for $attr - email

    if($hasPermissionForEmail)
    {
        // do nothing
    }
    else
    {
        $this->makeHidden('email');
    }

}

Теперь

$a->marker();

Примечание: может показаться, что он не работает, когда вы напрямую обращаетесь к атрибуту, например, $ a-> email, но когда объект отправляется вответ либо в виде JSON или массива это будет работать

...