A Pundit egy Ruby drágakő, amely egy nagyon egyszerű API-n keresztül kezeli az engedélyezést.
Ne feledje, hogy a hitelesítés különbözik a hitelesítéstől - a hitelesítés azt igazolja, hogy Ön az, akinek mondja magát, és a jogosultság azt igazolja, hogy engedélye van egy művelet végrehajtására.
A Pundit egyenesen az engedélyezési táborban van - használjon egy másik hitelesítési rendszert, például a Devise-t a hitelesítés kezeléséhez.
Hogyan működik a Pundit
1. lépés: Hozzon létre egy Policy
osztályt, amely foglalkozik engedélyezi a hozzáférést egy adott típusú rekord - legyen az egy Blog
vagy Potato
vagy User
.
2. lépés: Hívja a beépített authorize
függvényt, átadva azt, amelyhez hozzáférést próbál engedélyezni.
3. lépés: A Pundit megtalálja a megfelelő Policy
osztályt, és meghívja a Policy
metódust, amely megegyezik az Ön által engedélyezett módszer nevével. Ha az értéke igaz, akkor engedélye van a művelet végrehajtására. Ha nem, akkor kivételt vet.
Elég egyértelmű. Az egyes modellek logikája a saját házirendjébe van beágyazva, ami kiválóan alkalmas a dolgok rendben tartására. A versenyző engedélyezési könyvtár cancancanjának problémái voltak a bonyolult engedélyekkel, amelyek kiszabadultak a kezéből.
Kisebb módosításokra van szükség
A Pundit egyszerű konvencióit néha módosítani kell a bonyolultabb engedélyezési esetek támogatása érdekében.
További információ a házirenden belül érhető el
Alapértelmezés szerint a Pundit két objektumot biztosít az engedélyezési kontextushoz: a User
és a Record
jogosultat. Ez elegendő, ha az egész rendszerre kiterjedő szerepet a rendszer, mint Admin
vagy Moderator
, de nem elég, ha szüksége van engedélyezheti, hogy egy adott kontextusban.
Tegyük fel, hogy volt egy olyan rendszere, amely támogatta az an fogalmát Organization
, és különböző szerepeket kellett támogatnia ezeken a szervezeteken belül. Az egész rendszerre kiterjedő jogosultság nem csökkenti - nem akarja, hogy a Organization Potato rendszergazdája képes legyen a Narancssárga szervezettel foglalkozni, hacsak nem mindkét szervezet rendszergazdája. Az eset engedélyezésekor 3 elemre kell hozzáférnie: a User
, a Record
, és a felhasználó szerepinformációira a Organization
. Az ideális eset az lenne, ha hozzáférnénk ahhoz a szervezethez, amelyhez a nyilvántartás tartozik, de tegyük nehezebbé, és mondjuk, hogy ehhez nincs hozzáférésünk a nyilvántartáson vagy a felhasználón keresztül.
A Pundit lehetőséget nyújt további kontextus biztosítására. Az úgynevezett függvény definiálásával pundit_user
ez megváltoztathatja azt, ami a-nak tekinthető user
. Ha egy objektumot az engedélyezési kontextussal küld vissza ebből a függvényből, akkor ez a kontextus elérhetővé válik a házirendjeihez.
application_controller.rb
class ApplicationController < ActionController::Base include Pundit
def pundit_user AuthorizationContext.new(current_user, current_organization) endend
authorization_context.rb
class AuthorizationContext attr_reader :user, :organization
def initialize(user, organization) @user = user @organization = organization endend
application_policy.rb
class ApplicationPolicy attr_reader :request_organization, :user, :record
def initialize(authorization_context, record) @user = authorization_context.user @organization = authorization_context.organization @record = record end
def index? # Your policy has access to @user, @organization, and @record. endend
Irányelvei mostantól hozzáférhetnek mindhárom információhoz - látnia kell, hogy miként férne hozzá további információkhoz, ha szüksége lenne rá.
A konvenció felülbírálása és a használni kívánt házirend meghatározása
A Pundit elnevezési szokásokat alkalmaz, hogy összehangolja a hitelesíteni kívánt elemeket a megfelelő házirenddel. Legtöbbször ez jól működik, de bizonyos esetekben előfordulhat, hogy felül kell írnia ezt a konvenciót, például amikor olyan általános irányítópult-műveletet szeretne engedélyezni, amelyhez nincs társított modell. Szimbólumokkal adhatja meg, hogy mely műveletet vagy házirendet használja az engedélyezéshez:
#Below will call DashboardPolicy#bake_potato?authorize(:dashboard, :bake_potato?)
Ha van másképp nevezett modellje, akkor felülbírálhatja a policy_class
függvényt magában a modellben is:
class DashboardForAdmins def self.policy_class DashboardPolicy # This forces Pundit to use Dashboard Policy instead of looking # for DashboardForAdminsPolicy endend
Tesztelés
Az engedélyezés egyike azoknak a dolgoknak, amelyeket erősen ajánlok, hogy legyen egy automatizált tesztcsomag. Helytelen beállításuk katasztrofális lehet, és véleményem szerint ez az egyik legunalmasabb dolog, amelyet manuálisan kell tesztelni. Nagyszerű érzés, hogy egyetlen parancsot futtathat, és tudja, hogy véletlenül sem módosított egyetlen engedélyezési üzleti szabályt sem.
A Pundit nagyon egyszerűvé teszi a tesztelés engedélyezését.
def test_user_cant_destroy? assert_raises Pundit::NotAuthorizedError do authorize @record, :destroy? endend
def test_user_can_show? authorize @record, :show?end
Összességében szeretem a Pundit. Csak rövid ideig használtam, de máris jobban szeretem a cancancant, mint inkább karbantarthatóbb és tesztelhetőbb.
Hasznosnak találta ezt a történetet? Kérjük, tapsoljon, hogy megmutassa támogatását!
Ha nem találja hasznosnak, kérem tudassa velem, hogy miért egy hozzászólást !