Rails engedélyezés a Pundit segítségével

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 Policyosztályt, amely foglalkozik engedélyezi a hozzáférést egy adott típusú rekord - legyen az egy Blogvagy Potatovagy User.

2. lépés: Hívja a beépített authorizefüggvényt, átadva azt, amelyhez hozzáférést próbál engedélyezni.

3. lépés: A Pundit megtalálja a megfelelő Policyosztályt, és meghívja a Policymetó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 Recordjogosultat. Ez elegendő, ha az egész rendszerre kiterjedő szerepet a rendszer, mint Adminvagy 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_userez 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_classfü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 !