Engedélyeztetés
A menüpontok, funkciók elérését és
használatát úgynevezett Policy osztályok segítségével valósítjuk meg. Az
authentikáció része, hogy kit enged be a webalkalmazás az
adminisztrációs felületére, de onnantól kezdve, ha már bent van a
felhasználó, akkor az engedélyeztetés játszik szerepet abban, hogy mit
tud majd ott elérni és használni. A belső házirendünket kell tehát
felépítenünk és minden erőforrásnál meghatározzuk, hogy milyen
szerepkörű felhasználók férhetnek majd hozzá.
Az engedélyezéshez a Filament betartja az alkalmazásban regisztrált szabályokat. A következő módszereket használja:
- A viewAny()
segítségével teljesen elrejti az erőforrásokat a navigációs menüből, és
megakadályozza, hogy a felhasználó bármilyen funkciójához hozzáférjen.
- A view() egy rekord megtekintésének vezérlésére szolgál.
- A create() az új rekordok létrehozásának vezérlésére szolgál.
- Az update() egy rekord szerkesztésének vezérlésére szolgál.
- A delete() arra szolgál, hogy megakadályozhassa egyetlen rekord törlését.
- A deleteAny() arra szolgál, hogy megakadályozhassa a rekordok tömeges törlését.
- A Filament a deleteAny() metódust használja, mivel a több rekordon való iterálás és a delete() házirend ellenőrzése nem túl hatékony.
- A forceDelete() arra szolgál, hogy megakadályozhassa egy törlésre kijelölt rekord kényszertörlését.
- A forceDeleteAny() arra szolgál, hogy megakadályozhassa a rekordok tömeges kényszertörlését.
- A Filament a forceDeleteAny() metódust használja, mivel a több rekordon való iterálás és a forceDelete() házirend ellenőrzése nem túl hatékony.
- A restore() arra szolgál, hogy megakadályozhassa egyetlen "soft delete" opcióval törölt rekord visszaállítását.
- A restoreAny() arra szolgál, hogy megakadályozhassa a rekordok tömeges visszaállítását.
- A Filament a restoreAny() metódust használja, mivel a több rekordon való iterálás és a restore() házirend ellenőrzése nem túl hatékony.
- A reorder() a rekordok újrarendezésének ellenőrzésére szolgál.
A
Policy osztályokkal tehát egy-egy Model-hez vagy erőforráshoz való
hozzáférést tudjuk egy helyen szabályozni, például, hogy lehessen-e egy
berendezést törölni vagy frissíteni a rendszerben. De még mielőtt a
Karbantartással kapcsolatos funkciókra rátérnénk, előbb határozzuk meg,
hogy az adminisztrációs menüben szereplő elemekhez kik férhetnek hozzá.
php artisan make:policy PermissionPolicy --model=Permission
Az utasítás hatására létrejön az app mappában a Policies mappa, benne pedig a PermissionPolicy.php fájl.
A fájl importálásainál cseréljük ki az App\Models\Permission -t erre: Spatie\Permission\Models\Permission
Innentől kezdve viszont aránylag könnyű dolgunk lesz:
- Meg
kell vizsgálni, hogy a legenerált metódusok szükségesek-e az
erőforrásunk kezelésénél, vagy éppen van olyan metódus, ami hiányzik az
alapból legeneráltakból és nekünk szükségünk lenne rá.
- A
metódusok magja pedig megegyezik azzal, amit a korábbi seeder
osztályokban definiáltunk permission-öket, vagyis azt vizsgáljuk, hogy
az adott felhasználó "tudja-e" vagy "képes-e" megcsinálni például a
jogosultságot, a szerepkörén keresztül ellenőrzi le ezt a rendszer. Ne
akarjunk egyes felhasználókhoz jogosultságokat rendelni, mert az a
logikával szembe menne, maradjunk a szerepkörök alapján történő
jogosultság kiosztásnál és ellenőrzésnél.
A
PermissionPolicy osztályon bemutatom a működést: minden metódus
visszatérési típusa bool, vagyis igaz/hamis lehet. Ha a visszatérési
érték igaz, akkor az adott jogosultsággal rendelkező szerepkör és annak
felhasználói hozzáférnek ahhoz a művelethez. Az osztály tartalma:
public function viewAny(User $user): bool
{
return $user->can('read permissions');
}
public function view(User $user, Permission $permission): bool
{
return $user->can('read permissions');
}
public function create(User $user): bool
{
return $user->can('create permissions');
}
public function update(User $user, Permission $permission): bool
{
return $user->can('update permissions');
}
public function delete(User $user, Permission $permission): bool
{
return $user->can('delete permissions');
}
public function restore(User $user, Permission $permission): bool
{
return false;
}
public function forceDelete(User $user, Permission $permission): bool
{
return false;
}
A forceDelete() és restore()
metódusok nem is kellenének, hiszen ennél az érintett Permission Model
osztálynál nem alkalmazzuk a "soft delete" technikát, de a példa
kedvéért bennhagytam őket és false értékkel térnek vissza mindig. A
későbbiekben, ha mégis úgy döntenénk, hogy a Permission-öknél is
szeretnénk alkalmazni a soft delete-et, akkor ahhoz át kell alakítanunk a
Model osztályát és a permissions adattáblát is, majd utána kell itt
foglalkozni a forceDelete() és restore() metódusokkal.
A szerepkörökhöz tartozó RolePolicy osztály
gyakorlatilag tökéletesen ugyanígy rekonstruálható. Arra figyeljünk
csak, hogy az importálásnál ne a "mi" Role Model osztályunkat emelje be,
hanem a Spatie\Permission\Models\Role osztályt.
php artisan make:policy RolePolicy --model=Role
A felhasználók már érdekesebbek lesz, mivel ott szükség van a restore()
metódus megvalósítására ténylegesen (forceDelete()-et itt nem
engedünk), de a korábbi seeder osztályunk még nem volt felkészítve arra,
hogy ezt a "soft delete" funkcionalitást kell majd alkalmazni a
felhasználóknál, úgyhogy ezt az új jogosultságot létre kell hoznunk
"manuálisan" az alkalmazásunk jogosultságokat adminisztráló oldalán,
majd az új jogosultságot hozzá kell rendelni az admin szerepkörhöz is az
adminisztrációs felületen szintén! A létrehozandó jogosultság neve
legyen ez: restore users
A
"Válassz..." bemeneti mezőnél már akkor feldobja az egyetlen, eddig még
nem hozzáadott jogosultságot, amikor rákattintunk (fókuszba helyezzük) a
bemeneti mezőre. Ezután hozzuk létre a UserPolicy osztályt:
php artisan make:policy UserPolicy --model=User
Csak a restore() metódust emelem ki az új UserPolicy osztályból (a többi ugyanolyan felépítésű, mint azt korábban láthattuk):
public function restore(User $user, User $model): bool
{
return $user->can('restore users');
}
Ezzel elkészült a
jogosultsági rendszerhez szükséges három Policy osztály, viszont
érvényre még nem juttattuk őket. Ehhez az kell, hogy regisztráljuk a
Policy osztályokat itt: app / Providers / AuthServiceProvider.php A
megnyitott fájlban a $policies tömbhöz kell hozzáadni az új fájljainkat:
protected $policies = [
Permission::class => PermissionPolicy::class,
Role::class => RolePolicy::class,
User::class => UserPolicy::class,
];
Importáljuk is be őket a fájl tetején:
use Spatie\Permission\
Models
\Permission;
use Spatie\Permission\Models\Role;
use App\Models\User;
use App\Policies\PermissionPolicy;
use App\Policies\RolePolicy;
use App\Policies\UserPolicy;
Ha
most belépünk egy másik (típusú) böngészőben vagy egy inkognitó
ablakban a webes alkalmazásunkba egy nem admin szerepkörű felhasználóval
(például a repairer@admin.hu - password felhasználónév-jelszó
párossal), akkor már nem is fogja mutatni az alkalmazás a
menüstruktúrában a jogosultsági rendszerrel kapcsolatos menüpontokat:
Ha pedig közvetlenül szeretnénk elérni például a felhasználók kezelését ugyanitt (http://127.0.0.1:8000/users),
akkor 403 | Forbidden HTTP hibakódot kapnánk, ami arra utal mindig,
hogy nincs engedélyezve a hozzáférés ennek a felhasználónak.
Az
admin szerepkörű felhasználónál viszont még ugyanúgy elérhetőek a
Szerepkörök, Jogosultságok és Felhasználók menüpontok és
funkcionalitásaik.
Ezek után már nem okozhat problémát a
Berendezés típusok, Berendezések, Dokumentumok Policy osztályainak
létrehozása és a metódus magjainak feltöltése, majd a végén az
AuthServiceProvider.php fájlban a Policy osztályok beregisztrálása.
Akinek esetleg mégsem menne, az ebben a GitHub commit-ben tudja megvizsgálni a megvalósítás részleteit.
Ezután a
karbantartó és gépkezelő szerepkörű felhasználók is már csak olvasni
tudják a berendezések és dokumentumok listáját és részleteiket (lásd az iménti képernyőképet). A
berendezés típusokhoz már hozzá sem férnek. Ez amiatt van, mert a két
szerepkörhöz a korábban lefuttatott seeder osztályunk csak a "read
devices" és "read documents" jogosultságokat rendelte hozzá. Az már egy
döntés kérdése, hogy adunk-e még további jogköröket esetleg, de a
jelenlegi alapértelmezett állapotban csak olvasni tudják a részleteket
ennél a két erőforrás típusnál (berendezések és dokumentumok). További
jogosultságokra akkor lesz szükség, ha a hibabejelentési űrlapok is
bekerülnek a rendszerbe, akkor érdemes meghatározni azt, hogy milyen
jogosultságokkal rendelkezzenek a hibabejelentő űrlapok kapcsán az
említett szerepkörökhöz (karbantartó, gépkezelő) tartozó felhasználók.
Dolgozzunk együtt: egyéni oktatás, mentorálás, fejlesztés, tanácsadás
Ha
egyéni oktatás, mentorálás, vagy fejlesztési projekt kapcsán szeretnél
segítséget kérni tőlem, esetleg együttműködni velem, akkor keress meg a weboldalamon található elérhetőségeken keresztül!