Bouncer 是一種優雅的、與框架無關的方法,用於使用 Eloquent 模型管理任何應用程式的角色和能力。
bouncer:clean
Bouncer 是一種優雅的、與框架無關的方法,用於使用 Eloquent 模型管理任何應用程式的角色和能力。它具有富有表現力和流暢的語法,盡可能地不妨礙您:需要時使用它,不需要時忽略它。
有關 Bouncer 功能的快速、一目了然的列表,請查看備忘單。
Bouncer 與您在自己的應用程式中硬編碼的其他功能配合得很好。您的程式碼始終優先:如果您的程式碼允許執行某個操作,Bouncer 不會幹擾。
安裝後,您只需告訴保鑣您希望在門口允許什麼:
// Give a user the ability to create posts
Bouncer:: allow ( $ user )-> to ( ' create ' , Post::class);
// Alternatively, do it through a role
Bouncer:: allow ( ' admin ' )-> to ( ' create ' , Post::class);
Bouncer:: assign ( ' admin ' )-> to ( $ user );
// You can also grant an ability only to a specific model
Bouncer:: allow ( $ user )-> to ( ' edit ' , $ post );
當你在 Laravel 的門口檢查能力時,會自動諮詢 Bouncer。如果 Bouncer 看到已授予目前使用者的能力(無論是直接授予還是透過角色授予),它將授權檢查。
注意:Bouncer v1.0.2 需要 PHP 8.2+ 和 Laravel/Eloquent 11+。
如果您使用的是 Laravel v6-v10,請使用 Bouncer v1.0.1。如果您使用的是 Laravel v5.5-v5.8,請使用 Bouncer RC6。
使用 Composer 安裝 Bouncer:
composer require silber/bouncer
將 Bouncer 的特徵加入您的使用者模型:
use Silber Bouncer Database HasRolesAndAbilities ;
class User extends Model
{
use HasRolesAndAbilities;
}
現在,執行 Bouncer 的遷移。首先透過執行以下命令將遷移發佈到應用程式的migrations
目錄中:
php artisan vendor:publish --tag="bouncer.migrations"
最後,運行遷移:
php artisan migrate
每當您在程式碼中使用Bouncer
外觀時,請記住將此行新增至檔案頂部的命名空間匯入中:
use Bouncer ;
有關 Laravel Facade 的更多信息,請參閱 Laravel 文件。
使用 Composer 安裝 Bouncer:
composer require silber/bouncer
使用 Eloquent Capsule 元件設定資料庫:
use Illuminate Database Capsule Manager as Capsule ;
$ capsule = new Capsule ;
$ capsule -> addConnection ([ /* connection config */ ]);
$ capsule -> setAsGlobal ();
有關更多詳細信息,請參閱 Eloquent Capsule 文件。
透過以下任一方法運行遷移:
使用 vagabond 等工具在 Laravel 應用程式之外運行 Laravel 遷移。您將在遷移存根檔案中找到必要的遷移。
或者,您可以直接在資料庫中執行原始 SQL。
將 Bouncer 的特徵加入您的使用者模型:
use Illuminate Database Eloquent Model ;
use Silber Bouncer Database HasRolesAndAbilities ;
class User extends Model
{
use HasRolesAndAbilities;
}
建立 Bouncer 的實例:
use Silber Bouncer Bouncer ;
$ bouncer = Bouncer:: create ();
// If you are in a request with a current user
// that you'd wish to check permissions for,
// pass that user to the "create" method:
$ bouncer = Bouncer:: create ( $ user );
如果您在應用程式中使用依賴注入,則可以將Bouncer
實例註冊為容器中的單例:
use Silber Bouncer Bouncer ;
use Illuminate Container Container ;
Container:: getInstance ()-> singleton (Bouncer::class, function () {
return Bouncer:: create ();
});
現在您可以將Bouncer
注入任何需要它的類別中。
create
方法建立一個具有合理預設值的Bouncer
實例。要完全自訂它,請使用make
方法取得工廠實例。在工廠上呼叫create()
來建立Bouncer
實例:
use Silber Bouncer Bouncer ;
$ bouncer = Bouncer:: make ()
-> withCache ( $ customCacheInstance )
-> create ();
查看Factory
類別以查看所有可用的自訂。
設定在整個應用程式中使用哪個模型作為使用者模型:
$ bouncer -> useUserModel (User::class);
有關其他配置,請查看下面的配置部分。
預設情況下,Bouncer 的查詢會針對目前請求進行快取。為了獲得更好的效能,您可能需要啟用交叉請求快取。
為用戶添加角色和能力變得非常容易。您不必提前創建角色或能力。只需傳遞角色/能力的名稱,如果不存在,Bouncer 就會建立它。
注意:下面的範例都使用
Bouncer
外觀。如果您不使用外觀,則可以將SilberBouncerBouncer
的實例注入到您的類別中。
讓我們創建一個名為admin
角色,並賦予它ban-users
訪問我們網站的能力:
Bouncer:: allow ( ' admin ' )-> to ( ' ban-users ' );
就是這樣。在幕後,Bouncer 將為您創建Role
模型和Ability
模型。
如果您想要為角色/能力新增其他屬性,例如人類可讀的標題,您可以使用Bouncer
類別上的role
和ability
方法手動建立它們:
$ admin = Bouncer:: role ()-> firstOrCreate ([
' name ' => ' admin ' ,
' title ' => ' Administrator ' ,
]);
$ ban = Bouncer:: ability ()-> firstOrCreate ([
' name ' => ' ban-users ' ,
' title ' => ' Ban users ' ,
]);
Bouncer:: allow ( $ admin )-> to ( $ ban );
現在要將admin
角色授予用戶,只需告訴保鑣應該為給定用戶分配管理員角色:
Bouncer:: assign ( ' admin ' )-> to ( $ user );
或者,您可以直接對使用者assign
方法:
$ user -> assign ( ' admin ' );
有時您可能會想直接賦予使用者某種能力,而不使用角色:
Bouncer:: allow ( $ user )-> to ( ' ban-users ' );
在這裡,您也可以直接從使用者那裡完成相同的操作:
$ user -> allow ( ' ban-users ' );
有時您可能希望將功能限制為特定模型類型。只需將模型名稱作為第二個參數:
Bouncer:: allow ( $ user )-> to ( ' edit ' , Post::class);
如果您想限制特定模型實例的能力,請傳入實際模型:
Bouncer:: allow ( $ user )-> to ( ' edit ' , $ post );
使用toOwn
方法允許使用者管理自己的模型:
Bouncer:: allow ( $ user )-> toOwn (Post::class);
現在,當在入口處檢查用戶是否可以對給定帖子執行操作時,帖子的user_id
將與登入用戶的id
進行比較(這可以自訂)。如果它們匹配,則門將允許該操作。
上述內容將授予用戶“擁有”模型的所有能力。您可以透過呼叫to
方法來限制能力:
Bouncer:: allow ( $ user )-> toOwn (Post::class)-> to ( ' view ' );
// Or pass it an array of abilities:
Bouncer:: allow ( $ user )-> toOwn (Post::class)-> to ([ ' view ' , ' update ' ]);
您還可以允許使用者擁有應用程式中的所有類型的模型:
Bouncer:: allow ( $ user )-> toOwnEverything ();
// And to restrict ownership to a given ability
Bouncer:: allow ( $ user )-> toOwnEverything ()-> to ( ' view ' );
保鑣還可以收回用戶之前被指派的角色:
Bouncer:: retract ( ' admin ' )-> from ( $ user );
或直接在使用者上執行:
$ user -> retract ( ' admin ' );
保鑣還可以刪除先前授予用戶的能力:
Bouncer:: disallow ( $ user )-> to ( ' ban-users ' );
或直接針對使用者:
$ user -> disallow ( ' ban-users ' );
注意:如果使用者俱有允許他們
ban-users
角色,他們仍然具有該能力。要禁止它,請從角色中刪除該能力或從使用者中撤回該角色。
如果該能力是透過角色授予的,請告訴保鑣從該角色中刪除該能力:
Bouncer:: disallow ( ' admin ' )-> to ( ' ban-users ' );
若要刪除特定模型類型的功能,請將其名稱作為第二個參數傳遞:
Bouncer:: disallow ( $ user )-> to ( ' delete ' , Post::class);
警告:如果使用者有能力
delete
特定的$post
實例,上面的程式碼不會刪除該能力。您必須單獨刪除該功能 - 透過傳入實際的$post
作為第二個參數 - 如下所示。
若要刪除特定模型實例的功能,請傳入實際模型:
Bouncer:: disallow ( $ user )-> to ( ' delete ' , $ post );
注意:
disallow
方法僅刪除先前授予此使用者/角色的能力。如果您想要禁止更通用的能力所允許的子集,請使用forbid
方法。
Bouncer 還允許您forbid
給定的能力,以進行更細粒度的控制。有時,您可能希望授予使用者/角色涵蓋廣泛操作的能力,但隨後限制這些操作的一小部分。
以下是一些範例:
您可能允許使用者一般查看所有文檔,但不允許他們查看特定的高度機密文檔:
Bouncer:: allow ( $ user )-> to ( ' view ' , Document::class);
Bouncer:: forbid ( $ user )-> to ( ' view ' , $ classifiedDocument );
您可能希望允許superadmin
在您的應用程式中執行所有操作,包括新增/刪除使用者。那麼您可能擁有一個admin
角色,除了管理使用者之外,它還可以執行所有操作:
Bouncer:: allow ( ' superadmin ' )-> everything ();
Bouncer:: allow ( ' admin ' )-> everything ();
Bouncer:: forbid ( ' admin ' )-> toManage (User::class);
您可能希望偶爾禁止用戶,取消他們對所有能力的許可。然而,實際上刪除他們所有的角色和能力意味著當禁令被取消時我們必須弄清楚他們原來的角色和能力是什麼。
使用禁止能力意味著他們可以保留所有現有的角色和能力,但仍然不被授權做任何事情。我們可以透過創建一個特殊的banned
角色來實現這一點,我們將禁止該角色的所有內容:
Bouncer:: forbid ( ' banned ' )-> everything ();
然後,每當我們想要禁止使用者時,我們都會為他們分配banned
角色:
Bouncer:: assign ( ' banned ' )-> to ( $ user );
要刪除禁令,我們只需撤回用戶的角色:
Bouncer:: retract ( ' banned ' )-> from ( $ user );
如您所見,Bouncer 的禁止功能可讓您對應用程式中的權限進行大量精細控制。
若要刪除禁止的能力,請使用unforbid
方法:
Bouncer:: unforbid ( $ user )-> to ( ' view ' , $ classifiedDocument );
注意:這將刪除任何先前禁止的能力。如果授予該使用者/角色的其他常規能力尚未允許該能力,則它不會自動允許該能力。
注意:一般來說,您不需要直接檢查角色。最好允許角色具有某些能力,然後檢查這些能力。如果你需要的東西很籠統,你就能創造出廣泛的能力。例如,
access-dashboard
功能始終比直接檢查admin
或editor
角色更好。在極少數情況下,您確實想要檢查角色,可以在此處使用該功能。
保鑣可以檢查使用者是否具有特定角色:
Bouncer:: is ( $ user )-> a ( ' moderator ' );
如果您要檢查的角色以元音開頭,您可能需要使用an
方法:
Bouncer:: is ( $ user )-> an ( ' admin ' );
相反,您還可以檢查使用者是否沒有特定角色:
Bouncer:: is ( $ user )-> notA ( ' moderator ' );
Bouncer:: is ( $ user )-> notAn ( ' admin ' );
您可以檢查使用者是否具有多種角色之一:
Bouncer:: is ( $ user )-> a ( ' moderator ' , ' editor ' );
您還可以檢查使用者是否具有所有給定的角色:
Bouncer:: is ( $ user )-> all ( ' editor ' , ' moderator ' );
您也可以檢查使用者是否沒有給定的角色:
Bouncer:: is ( $ user )-> notAn ( ' editor ' , ' moderator ' );
這些檢查也可以直接對使用者進行:
$ user -> isAn ( ' admin ' );
$ user -> isA ( ' subscriber ' );
$ user -> isNotAn ( ' admin ' );
$ user -> isNotA ( ' subscriber ' );
$ user -> isAll ( ' editor ' , ' moderator ' );
您可以透過使用者是否具有給定角色來查詢他們:
$ users = User:: whereIs ( ' admin ' )-> get ();
您也可以傳遞多個角色來查詢具有任何給定角色的使用者:
$ users = User:: whereIs ( ' superadmin ' , ' admin ' )-> get ();
要查詢具有所有給定角色的用戶,請使用whereIsAll
方法:
$ users = User:: whereIsAll ( ' sales ' , ' marketing ' )-> get ();
您可以直接從使用者模型取得使用者的所有角色:
$ roles = $ user -> getRoles ();
您可以直接從使用者模型獲取使用者的所有能力:
$ abilities = $ user -> getAbilities ();
這將返回用戶允許的能力的集合,包括透過其角色授予用戶的任何能力。
您還可以獲得已明確禁止的能力清單:
$ forbiddenAbilities = $ user -> getForbiddenAbilities ();
授權使用者直接在 Laravel 的Gate
或使用者模型上處理( $user->can($ability)
)。
為了方便起見, Bouncer
類別提供了以下直通方法:
Bouncer:: can ( $ ability );
Bouncer:: can ( $ ability , $ model );
Bouncer:: canAny ( $ abilities );
Bouncer:: canAny ( $ abilities , $ model );
Bouncer:: cannot ( $ ability );
Bouncer:: cannot ( $ ability , $ model );
Bouncer:: authorize ( $ ability );
Bouncer:: authorize ( $ ability , $ model );
它們直接呼叫Gate
類別上的等效方法。
Bouncer 不會加入自己的刀片指令。由於 Bouncer 直接與 Laravel 的閘門配合使用,因此只需使用其@can
指令來檢查當前使用者的能力:
@can ('update', $post)
< a href =" {{ route('post.update', $post) }} " > Edit Post </ a >
@endcan
由於通常不建議直接檢查角色,因此 Bouncer 沒有為此提供單獨的指示。如果您仍然堅持檢查角色,可以使用通用@if
指令來執行此操作:
@ if ( $ user -> isAn ( ' admin ' ))
//
@endif
Bouncer 執行的所有查詢都會針對目前請求進行快取。如果啟用跨請求緩存,快取將在不同請求之間持續存在。
無論何時您需要,您都可以完全刷新保鑣的快取:
Bouncer:: refresh ();
注意:為所有使用者完全刷新快取會使用快取標記(如果可用)。並非所有快取驅動程式都支援此功能。請參閱 Laravel 的文檔以查看您的驅動程式是否支援快取標籤。如果您的驅動程式不支援快取標記,則呼叫
refresh
可能會有點慢,具體取決於系統中的使用者數量。
或者,您可以僅為特定用戶刷新快取:
Bouncer:: refreshFor ( $ user );
注意:使用多租用戶範圍時,這只會重新整理目前範圍上下文中使用者的快取。要清除不同範圍上下文中同一用戶的快取數據,必須從該範圍內呼叫它。
Bouncer 完全支援多租戶應用程序,可讓您在同一應用程式中無縫整合所有租戶的 Bouncer 角色和能力。
首先,首先將範圍中間件發佈到您的應用程式中:
php artisan vendor:publish --tag="bouncer.middleware"
中間件現在將發佈到app/Http/Middleware/ScopeBouncer.php
。您可以在該中間件中告訴 Bouncer 對於目前請求使用哪個租用戶。例如,假設您的使用者都有account_id
屬性,那麼您的中間件將如下所示:
public function handle ( $ request , Closure $ next )
{
$ tenantId = $ request -> user ()-> account_id ;
Bouncer:: scope ()-> to ( $ tenantId );
return $ next ( $ request );
}
當然,您可以自由修改此中間件以滿足您應用程式的需求,例如從子網域等中提取租用戶資訊。
現在中間件已經就位,請務必將其註冊到您的 HTTP 核心中:
protected $ middlewareGroups = [
' web ' => [
// Keep the existing middleware here, and add this:
App Http Middleware ScopeBouncer::class,
]
];
Bouncer 的所有查詢現在都將限定在給定租戶範圍內。
根據應用程式的設置,您實際上可能並不希望所有查詢的範圍都限定在目前租用戶。例如,您可能擁有一組對所有租戶相同的固定角色/能力,並且僅允許您的使用者控制為哪些使用者指派哪些角色以及哪些角色具有哪些能力。為了實現這一點,您可以告訴 Bouncer 的作用域僅作用於 Bouncer 模型之間的關係,而不是模型本身:
Bouncer:: scope ()-> to ( $ tenantId )-> onlyRelations ();
此外,您的應用程式甚至可能不允許使用者控制給定角色擁有哪些能力。在這種情況下,請告訴 Bouncer 的範圍從範圍中排除角色能力,以便這些關係在所有租戶中保持全局:
Bouncer:: scope ()-> to ( $ tenantId )-> onlyRelations ()-> dontScopeRoleAbilities ();
如果您的需求比上面概述的更專業,您可以使用您需要的任何自訂邏輯來建立自己的Scope
:
use Silber Bouncer Contracts Scope ;
class MyScope implements Scope
{
// Whatever custom logic your app needs
}
然後,在服務提供者中註冊您的自訂範圍:
Bouncer:: scope ( new MyScope );
Bouncer 將在其執行過程中的各點呼叫Scope
介面上的方法。您可以根據您的具體需求自由處理它們。
Bouncer 附帶了合理的預設值,因此大多數時候不需要任何設定。為了進行更細粒度的控制,可以透過呼叫Bouncer
類別上的各種配置方法來自訂 Bouncer。
如果您只使用這些設定選項中的一兩個,則可以將它們貼到主AppServiceProvider
的boot
方法中。如果它們開始成長,您可以在app/Providers
目錄中建立一個單獨的BouncerServiceProvider
類別(請記住將其註冊到providers
者配置陣列中)。
預設情況下,Bouncer 執行的所有查詢都會針對目前請求進行快取。為了獲得更好的效能,您可能需要使用跨請求快取:
Bouncer:: cache ();
警告:如果您啟用交叉請求緩存,則每當您更改使用者的角色/能力時,您都有責任刷新快取。有關如何刷新緩存,請參閱刷新緩存。
相反,您有時可能希望完全停用緩存,即使在同一請求中:
Bouncer:: dontCache ();
當您想要針對剛剛授予的角色/能力運行斷言時,這在單元測試中特別有用。
若要變更 Bouncer 使用的資料庫表名稱,請將關聯數組傳遞給tables
方法。鍵應該是 Bouncer 的預設表名稱,值應該是您希望使用的表名稱。您不必傳入所有表名稱;只更改您想要更改的內容。
Bouncer:: tables ([
' abilities ' => ' my_abilities ' ,
' permissions ' => ' granted_abilities ' ,
]);
Bouncer 發布的遷移使用此配置中的表名稱,因此請確保在實際運行遷移之前將這些名稱準備就緒。
您可以輕鬆擴展 Bouncer 的內建Role
和Ability
模型:
namespace App Models ;
use Silber Bouncer Database Ability as BouncerAbility ;
class Ability extends BouncerAbility
{
// custom code
}
namespace App Models ;
use Silber Bouncer Database Role as BouncerRole ;
class Role extends BouncerRole
{
// custom code
}
或者,您可以使用 Bouncer 的IsAbility
和IsRole
特徵,而無需實際擴展任何 Bouncer 模型:
namespace App Models ;
use Illuminate Database Eloquent Model ;
use Silber Bouncer Database Concerns IsAbility ;
class Ability extends Model
{
use IsAbility;
// custom code
}
namespace App Models ;
use Illuminate Database Eloquent Model ;
use Silber Bouncer Database Concerns IsRole ;
class Role extends Model
{
use IsRole;
// custom code
}
如果您使用特徵而不是擴充 Bouncer 的模型,請務必自行設定正確的$table
名稱和$fillable
欄位。
無論您使用哪種方法,下一步都是實際告訴 Bouncer 使用您的自訂模型:
Bouncer:: useAbilityModel ( App Models Ability::class);
Bouncer:: useRoleModel ( App Models Role::class);
注意:Eloquent 根據父模型名稱決定關係的外鍵(請參閱 Eloquent 文件)。為了簡單起見,將您的自訂類別命名為與 Bouncer 相同的名稱:分別為
Ability
和Role
。如果您需要使用不同的名稱,請務必更新遷移檔案或覆蓋關係方法以明確設定其外鍵。
預設情況下,Bouncer 會自動使用預設身份驗證防護的使用者模型。
如果您將 Bouncer 與非預設防護一起使用,並且它使用不同的使用者模型,您應該讓 Bouncer 了解您想要使用的使用者模型:
Bouncer:: useUserModel ( App Admin::class);
在 Bouncer 中,所有權的概念用於允許使用者對他們「擁有」的模型執行操作。
預設情況下,Bouncer 將根據目前使用者的主鍵檢查模型的user_id
。如果需要,可以將其設定為不同的屬性:
Bouncer:: ownedVia ( ' userId ' );
如果不同的模型使用不同的所有權列,您可以分別註冊它們:
Bouncer:: ownedVia (Post::class, ' created_by ' );
Bouncer:: ownedVia (Order::class, ' entered_by ' );
為了更好地控制,您可以使用自訂邏輯傳遞閉包:
Bouncer:: ownedVia (Game::class, function ( $ game , $ user ) {
return $ game -> team_id == $ user -> team_id ;
});
人們不斷詢問 Bouncer 中的一些概念,因此這裡是其中一些主題的簡短清單:
播種初始角色和能力可以在常規 Laravel 播種者課程中完成。首先為 Bouncer 建立一個特定的種子檔案:
php artisan make:seeder BouncerSeeder
將所有播種角色和能力代碼放入播種者的run
方法中。下面是一個範例:
use Bouncer ;
use Illuminate Database Seeder ;
class BouncerSeeder extends Seeder
{
public function run ()
{
Bouncer:: allow ( ' superadmin ' )-> everything ();
Bouncer:: allow ( ' admin ' )-> everything ();
Bouncer:: forbid ( ' admin ' )-> toManage (User::class);
Bouncer:: allow ( ' editor ' )-> to ( ' create ' , Post::class);
Bouncer:: allow ( ' editor ' )-> toOwn (Post::class);
// etc.
}
}
要實際運行它,請將播種器的類別名稱傳遞給db:seed
命令的class
選項:
php artisan db:seed --class=BouncerSeeder
Bouncer 的scope
可用於劃分網站的不同部分,為每個部分創建一個具有自己的一組角色和能力的孤島:
建立一個ScopeBouncer
中間件,它接受$identifier
並將其設定為目前作用域:
use Bouncer , Closure ;
class ScopeBouncer
{
public function handle ( $ request , Closure $ next , $ identifier )
{
Bouncer:: scope ()-> to ( $ identifier );
return $ next ( $ request );
}
}
在您的 HTTP 核心類別中註冊這個新的中間件作為路由中間件:
protected $ routeMiddleware = [
// Keep the other route middleware, and add this:
' scope-bouncer ' => App Http Middleware ScopeBouncer::class,
];
在您的路線服務提供者中,分別為公共路線和儀表板路線套用具有不同識別碼的中間件:
Route:: middleware ([ ' web ' , ' scope-bouncer:1 ' ])
-> namespace ( $ this -> namespace )
-> group ( base_path ( ' routes/public.php ' ));
Route:: middleware ([ ' web ' , ' scope-bouncer:2 ' ])
-> namespace ( $ this -> namespace )
-> group ( base_path ( ' routes/dashboard.php ' ));
就是這樣。現在,所有角色和能力將分別針對網站的每個部分進行劃分。若要微調範圍的範圍,請參閱自訂 Bouncer 的範圍。
從 Laravel 5.4 開始,預設資料庫字元集現在是utf8mb4
。如果您在 Laravel 5.4+ 中使用某些資料庫的舊版本(MySQL 低於 5.7.7 或 MariaDB 低於 10.2.2),則在嘗試在字串列上建立索引時會收到 SQL 錯誤。若要解決此問題,請變更AppServiceProvider
中 Laravel 的預設字串長度:
use Illuminate Support Facades Schema ;
public function boot ()
{
Schema:: defaultStringLength ( 191 );
}
您可以在這篇 Laravel 新聞文章中閱讀更多內容。
JSON 欄位是 MySQL (5.7.8) 和 MariaDB (10.2.7) 的相對較新的補充。如果您使用的是這些資料庫的舊版本,則無法使用 JSON 欄位。
最好的解決方案是升級您的資料庫。如果目前不可能,您可以將已發佈的移轉檔案變更為使用text
列:
- $table->json('options')->nullable();
+ $table->text('options')->nullable();
bouncer:clean
bouncer:clean
指令刪除未使用的能力。執行此命令將刪除兩種未使用的能力:
未分配的能力- 未分配給任何人的能力。例如:
Bouncer:: allow ( $ user )-> to ( ' view ' , Plan::class);
Bouncer:: disallow ( $ user )-> to ( ' view ' , Plan::class);
此時,「查看計劃」能力尚未分配給任何人,因此它將被刪除。
注意:根據您的應用程式的上下文,您可能不想刪除它們。如果您讓使用者在應用程式的 UI 中管理能力,您可能不想刪除未指派的能力。見下文。
孤立能力- 模型已刪除的模型能力:
Bouncer:: allow ( $ user )-> to ( ' delete ' , $ plan );
$ plan -> delete ();
由於該計劃不再存在,該能力不再有任何用處,因此它將被刪除。
如果您只想刪除未使用的能力,請使用以下標誌之一來運行它:
php artisan bouncer:clean --unassigned
php artisan bouncer:clean --orphaned
如果您不向其傳遞任何標誌,它將刪除兩種類型的未使用的能力。
若要定期自動執行此命令,請將其新增至控制台核心的計畫中:
$ schedule -> command ( ' bouncer:clean ' )-> weekly ();
// Adding abilities for users
Bouncer:: allow ( $ user )-> to ( ' ban-users ' );
Bouncer:: allow ( $ user )-> to ( ' edit ' , Post::class);
Bouncer:: allow ( $ user )-> to ( ' delete ' , $ post );
Bouncer:: allow ( $ user )-> everything ();
Bouncer:: allow ( $ user )-> toManage (Post::class);
Bouncer:: allow ( $ user )-> toManage ( $ post );
Bouncer:: allow ( $ user )-> to ( ' view ' )-> everything ();
Bouncer:: allow ( $ user )-> toOwn (Post::class);
Bouncer:: allow ( $ user )-> toOwnEverything ();
// Removing abilities uses the same syntax, e.g.
Bouncer:: disallow ( $ user )-> to ( ' delete ' , $ post );
Bouncer:: disallow ( $ user )-> toManage (Post::class);
Bouncer:: disallow ( $ user )-> toOwn (Post::class);
// Adding & removing abilities for roles
Bouncer:: allow ( ' admin ' )-> to ( ' ban-users ' );
Bouncer:: disallow ( ' admin ' )-> to ( ' ban-users ' );
// You can also forbid specific abilities with the same syntax...
Bouncer:: forbid ( $ user )-> to ( ' delete ' , $ post );
// And also remove a forbidden ability with the same syntax...
Bouncer:: unforbid ( $ user )-> to ( ' delete ' , $ post );
// Re-syncing a user's abilities
Bouncer:: sync ( $ user )-> abilities ( $ abilities );
// Assigning & retracting roles from users
Bouncer:: assign ( ' admin ' )-> to ( $ user );
Bouncer:: retract ( ' admin ' )-> from ( $ user );
// Assigning roles to multiple users by ID
Bouncer:: assign ( ' admin ' )-> to ([ 1 , 2 , 3 ]);
// Re-syncing a user's roles
Bouncer:: sync ( $ user )-> roles ( $ roles );
// Checking the current user's abilities
$ boolean = Bouncer:: can ( ' ban-users ' );
$ boolean = Bouncer:: can ( ' edit ' , Post::class);
$ boolean = Bouncer:: can ( ' delete ' , $ post );
$ boolean = Bouncer:: cannot ( ' ban-users ' );
$ boolean = Bouncer:: cannot ( ' edit ' , Post::class);
$ boolean = Bouncer:: cannot ( ' delete ' , $ post );
// Checking a user's roles
$ boolean = Bouncer:: is ( $ user )-> a ( ' subscriber ' );
$ boolean = Bouncer:: is ( $ user )-> an ( ' admin ' );
$ boolean = Bouncer:: is ( $ user )-> notA ( ' subscriber ' );
$ boolean = Bouncer:: is ( $ user )-> notAn ( ' admin ' );
$ boolean = Bouncer:: is ( $ user )-> a ( ' moderator ' , ' editor ' );
$ boolean = Bouncer:: is ( $ user )-> all ( ' moderator ' , ' editor ' );
Bouncer:: cache ();
Bouncer:: dontCache ();
Bouncer:: refresh ();
Bouncer:: refreshFor ( $ user );
其中一些功能也可以直接在使用者模型上使用:
$ user -> allow ( ' ban-users ' );
$ user -> allow ( ' edit ' , Post::class);
$ user -> allow ( ' delete ' , $ post );
$ user -> disallow ( ' ban-users ' );
$ user -> disallow ( ' edit ' , Post::class);
$ user -> disallow ( ' delete ' , $ post );
$ user -> assign ( ' admin ' );
$ user -> retract ( ' admin ' );
$ boolean = $ user -> isAn ( ' admin ' );
$ boolean = $ user -> isAn ( ' editor ' , ' moderator ' );
$ boolean = $ user -> isAll ( ' moderator ' , ' editor ' );
$ boolean = $ user -> isNotAn ( ' admin ' , ' moderator ' );
// Querying users by their roles
$ users = User:: whereIs ( ' superadmin ' )-> get ();
$ users = User:: whereIs ( ' superadmin ' , ' admin ' )-> get ();
$ users = User:: whereIsAll ( ' sales ' , ' marketing ' )-> get ();
$ abilities = $ user -> getAbilities ();
$ forbidden = $ user -> getForbiddenAbilities ();
在 Spatie 慷慨地贈送社區的無數軟體包中,您會發現出色的 laravel-permission 軟體包。與 Bouncer 一樣,它與 Laravel 的內建門和權限檢查很好地集成,但在語法、資料庫結構和功能方面有一組不同的設計選擇。
Bouncer 是根據 MIT 許可證授權的開源軟體