Sprawdzanie permisji w Laravelu

0

Witam,
Zastanawiam się nad profesjonalnym sposobem sprawdzania czy użytkownik posiada odpowiednią permisję do odczytywania specyficznego pola modelu. Wyjaśnię dokładnie o co mi chodzi.

Mam prostą funkcję, która zwraca wszystkich userów z bazy danych

    public function index($perPage = 30)
    {
        return User::Select('id', 'name', 'email')->paginate($perPage);
    }

lecz jednak chciałbym, dać dostęp do emaili z bazy danych tylko administratorom, którzy mają do tego odpowiednie uprawnienia, a zwykłym użytkownikom umożliwić jedynie dostęp do pól 'id' i 'name'.

Napisałem do tego tą funkcje po swojemu, Każda jedna permisja daje dostęp tylko do jednego pola.
Zwykłe usery mają domyślnie 2 permisje "users.show.id" i "users.show.name" a administratorzy wszystkie.

    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);
    }

Nie jest to dobra praktyka, bo gdyby model miał więcej pól to bym musiał robić te ify na 100 linijek w kontrolerze stąd moje pytanie czy jest na to lepszy sposób?

0

Przykładowa dyskusja na temat: Wzorzec projektowy, unikanie if-ów, dobre praktyki

2

Napisz coś w stylu:

$fields = [];
$fields_perm = $user->getFillable();    //albo na sztywno:  $fields_perm = ['id','email','name'];

foreach($fields_perm as $field_perm){
    if($user->hasPermissionTo("users.show.{$field_perm}")) {
        $fields[] = $field_perm;
    }
}
return User::Select($fields)->paginate($perPage);

getFillable() to metoda z klasy modelu bazowego, tj. Illuminate\Eloquent\Model - przetrzymuje ona wszystkie pola (kolumny) danej tabeli którą odwzorowuje model.

1 użytkowników online, w tym zalogowanych: 0, gości: 1