本文主要全面講解在不适用第三方包的情況下,如何在基于Laravel架構上,研發社交系統ThinkSNS+時,履歷一套優雅而不失成本效益的使用者權限管理體系功能,【内含ThinkSNS真實代碼】。
需求場景
就是使用者組+權限節點,這個需求 laravel 有很多很好的第三方包實作。下面描述代碼不參與緩存機制純資料庫查詢,給大家提供一個思路。
下面的代碼都是來自于ThinkSNS+,是基于 Laravel 全新開發的 ThinkSNS 社交開源項目,遵循 Apache-2.0 開源協定。歡迎 Star 哦。
資料表設計
其實這一塊我個人是參考的 Zizaco/entrust 因為我覺得,大多數情況下,我們要用的角色和權限節點都是真多使用者的。資料表設計如下:

可以看到關系如下 user -> role -> ability ,其中關系全部都是多對多關系。一個使用者可以擁有多個 role,一個 ability 可以被配置設定給多個 role 。
鍊式方法設計
$user->ability('create user'); // 判斷是否有 create user 權限。
$user->ability('owner', 'delete user'); // 判斷使用者是否擁有 owner 使用者組,且是否這個組擁有 delete user 權限。
$user->ability(); // 傳回一個 Ability 執行個體。
$user->roles; // 讀取使用者所擁有的所有使用者組。
$user->roles(); // 擷取 Builder 執行個體。
$user->roles('owner'); // 檢查使用者是否擁有 owner 使用者組,擁有傳回 model 執行個體,否則傳回 false。
$user->ability()->roles(); // 讀取使用者所擁有的所有使用者組。傳回的是一個 集合。可用集合所有方法。
$user->ability()->roles('owner'); // 檢查使用者是否擁有 owner 使用者組,擁有傳回 model 執行個體,否則傳回 false。
$user->ability()->all(); // 傳回使用者擁有的所有權限集合。
$user->ability()->all('create user'); // 檢查使用者是否擁有 create user 權限,沒有傳回 false ,有傳回 ability 執行個體。
其中調用 $user->ability()->all() 和 $user->ability()->all() 都是傳回的 集合 可以鍊式調用集合下的所有方法進一步操作。
ability 使用者 Trait
<?php
namespace ZhiyiPlusModelsConcerns;
use ZhiyiPlusModelsRole;
use ZhiyiPlusServicesUserAbility;
trait UserHasAbility
{
}
Ability 執行個體
namespace ZhiyiPlusServices;
use IlluminateSupportCollection;
use ZhiyiPlusModelsUser as UserModel;
use ZhiyiPlusContractsModelUserAbility as UserAbilityContract;
class UserAbility implements UserAbilityContract
Role 模型所需代碼
namespace ZhiyiPlusModels;
use IlluminateDatabaseEloquentModel;
class Role extends Model
使用
然後我們打開 User 模型wen jia檔案添加如下代碼:
class User ...
總結
其實性狀在 User 模型中隻暴露了 roles 和 ability 兩個公開方法。但是已經足以勝任使用者組權限判斷邏輯了。
整個 ability 都是結合在集合之上的一些封裝,這樣是的代碼調用更加優雅。
以上代碼是在開發ThinkSNS+中的實際真實代碼。具體的實作可參考項目。
以上代碼都來自于ThinkSNS Plus,看完整的開發代碼可以看倉庫:
(開源不易,求 Star )