## 說明
`Zizaco/Entrust` 是 Laravel 下 用戶權限系統 的解決方案, 配合 用戶身份認證 擴展包 `Zizaco/confide` 使用, 可以快速搭建出一套具備高擴展性的用戶系統.
`Confide`, `Entrust `和 `Sentry`
項目地址
> https://github.com/Zizaco/entrust
#### 首先兩個概念分清楚:
* 用戶身份認證 `Authentication` - 處理用戶登錄, 退出, 注冊, 找回密碼, 重置密碼, 用戶郵箱認證 etc..
* 權限管理 `Authorization` - 負責 用戶 與 權限, 用戶組 三者之間的對應, 以及管理.
下面是這幾個 Package 的簡單區別:
* `Sentry` = 用戶身份認證 + 權限管理;
* `Zizaco/Entrust` = 權限管理;
* `Zizaco/confide` = 用戶身份認證;
用戶身份認證 和 權限管理 分開來做有什么好處呢?
分開的話可以更靈活, 有些項目因為特殊的業務邏輯, 無法使用 `Confide `的 用戶身份認證, 但是卻需要用到 權限管理, 如: `PHPHub `.
Laravel-blog 就是一個簡單的應用, 使用了 `Confide` 做 用戶身份認證, `Entrust` 做 權限管理, 可以作為參考.
## 安裝
* composer.json
~~~
"zizaco/entrust": "1.2.*@dev"
~~~
* install
~~~
composer update
~~~
* provider
修改 `app/config/app.php` 文件, 在 `providers` 數組里面添加:
~~~
'Zizaco\Entrust\EntrustServiceProvider',
~~~
* aliase
修改 app/config/app.php 文件, 在 aliases 數組里面添加:
~~~
'Entrust' => 'Zizaco\Entrust\EntrustFacade',
~~~
* 系統配置
Entrust 會利用 config/auth.php 里面的值, 去決定使用那個 Model 和 用戶表名.
* 生成 Migration
~~~
php artisan entrust:migration
~~~
會生成 <timestamp>_entrust_setup_tables.php Migration 文件, 檢查沒問題后:
~~~
php artisan migrate
~~~
* Models
創建 app/models/Role.php 文件, 內容為以下:
~~~
<?php
use Zizaco\Entrust\EntrustRole;
class Role extends EntrustRole
{
}
~~~
創建 app/models/Permission.php 文件, 內容為以下:
~~~
<?php
use Zizaco\Entrust\EntrustPermission;
class Permission extends EntrustPermission
{
}
~~~
修改 app/models/User.php 文件, 添加 HasRole trait:
~~~
<?php
use Zizaco\Entrust\HasRole;
class User extends Eloquent /* or ConfideUser 'wink' */{
use HasRole; // Add this trait to your user model
...
~~~
最后, 生成自動加載:
~~~
composer dump-autoload
~~~
## 基礎概念
三個主要數據對象, 以及他們之間的關系:
* User - 用戶, 一個用戶可以屬于多個用戶組, 不直接掛鉤權限, 讓用戶組和權限綁定;
* Roles - 用戶組, 一個用戶組可以擁有多個權限;
* Permission - 權限;
四個數據庫表說明:
安裝的第 6 步會產生一個 Migration, 此文件定義了 4 張數據庫表:
* roles - 用戶組信息表;
* assigned_roles - 用戶和用戶組之間的對應關系;
* permissions - 權限信息表;
* permission_role - 權限和用戶組之間的對應關系.
## 實例
接下來我們來創建用戶組和權限, 并授權用戶
創建用戶組
~~~
$admin = new Role;
$admin->name = 'Admin';
$admin->save();
$owner = new Role;
$owner->name = 'Owner';
$owner->save();
~~~
#### 創建權限
~~~
$manageUsers = new Permission;
$manageUsers->name = 'manage_users';
$manageUsers->display_name = 'Manage Users';
$manageUsers->save();
$managePosts = new Permission;
$managePosts->name = 'manage_posts';
$managePosts->display_name = 'Manage Posts';
$managePosts->save();
~~~
#### 添加用戶組權限
~~~
$owner->perms()->sync(array($managePosts->id, $manageUsers->id));
$admin->perms()->sync(array($managePosts->id));
~~~
#### 添加用戶到用戶組
~~~
// 獲取用戶
$user = User::where('username','=','Zizaco')->first();
// 可以使用 Entrust 提供的便捷方法用戶授權
// 注: 參數可以為 Role 對象, 數組, 或者 ID
$user->attachRole( $admin );
// 或者使用 Eloquent 自帶的對象關系賦值
$user->roles()->attach( $admin->id ); // id only
~~~
## 使用
#### 基本權限判斷
判斷用戶是否屬于某個用戶組:
~~~
$user->hasRole("Owner"); // false
$user->hasRole("Admin"); // true
~~~
判斷用戶是否擁有某個權限 (通過用戶組):
~~~
$user->can("manage_posts"); // true
$user->can("manage_users"); // false
~~~
使用 ability 方法同時判斷多個權限和用戶組
~~~
$user->ability(['Admin','Owner'], ['manage_posts','manage_users']);
// 或者
$user->ability('Admin,Owner', 'manage_posts,manage_users');
~~~
#### 路由過濾
Entrust 還提供幫助方法, 用來做路由過濾:
~~~
// 有 `manage_posts` 權限的用戶, 才能訪問 `admin/posts` 開頭的鏈接
Entrust::routeNeedsPermission( 'admin/post*', 'manage_posts' );
// 屬于 `Owner` 用戶組的人, 才能訪問 `admin/advanced*` 開頭的鏈接
Entrust::routeNeedsRole( 'admin/advanced*', 'Owner' );
// 可以在第二個選項傳參數組, 當前用戶需要符合所有傳參的用戶組或者權限,
// 才能授權成功
Entrust::routeNeedsPermission( 'admin/post*', ['manage_posts','manage_comments'] );
Entrust::routeNeedsRole( 'admin/advanced*', ['Owner','Writer'] );
~~~
## 總結
一般我會在 `Migration` 里初始化基本的用戶組, 見 Laravel Blog 項目里面的 `Entrust Migration` .
## 參考
> PHPHub 和 Laravel-Blog 都使用 Entrust 進行用戶權限管理, 可以作為參考;
* * * * *
原文地址:[https://phphub.org/index.php/topics/166](https://phphub.org/index.php/topics/166)
- 前言
- 發行說明/L5新特性
- 升級向導
- 升級到 5.0.16
- 從 4.2 升級到 5.0
- 從 4.1 升級到 4.2
- 從 4.1.x 升級到 4.1.29
- 從 4.1.25 升級到 4.1.26
- 從 4.0 升級到 4.1
- 貢獻向導
- 環境配置
- 安裝
- 配置
- 基本功能
- 路由
- 基本路由
- CSRF 保護
- 方法欺騙
- 路由參數
- 命名路由
- 路由群組
- 路由模型綁定
- 拋出 404 錯誤
- 中間件
- 建立中間件
- 注冊中間件
- 可終止中間件
- 控制器
- 基礎控制器
- 控制器中間件
- 隱式控制器
- RESTful 資源控制器
- 請求
- 取得請求實例
- 取得輸入數據
- 舊輸入數據
- Cookies
- 上傳文件
- 其他的請求信息
- 響應
- 基本響應
- 重定向
- 其他響應
- 響應宏
- 系統架構
- 服務提供者
- 基本提供者例子
- 注冊提供者
- 緩載提供者
- 服務容器
- 基本用法
- 將接口綁定到實現
- 上下文綁定
- 標簽
- 實際應用
- 容器事件
- 參考:理解PHP 依賴注入|Laravel IoC容器
- Contracts
- 為什么用 Contracts
- Contract 參考
- 如何使用 Contracts
- Facades
- 實際用法
- 建立 Facades
- 模擬 Facades
- Facade 類參考
- 請求的生命周期
- 生命周期概要
- 聚焦于服務提供者
- 應用程序結構
- 根目錄
- App 目錄
- 為應用程序配置命名空間
- 系統服務
- 認證
- 用戶認證
- 取得經過認證的用戶
- 保護路由
- HTTP 基本認證
- 忘記密碼與重設
- 第三方登陸認證
- 交易
- 配置文件
- 訂購方案
- 一次性付款
- Single Charges
- 免信用卡試用
- 訂購轉換
- 訂購數量
- 取消訂購
- 恢復訂購
- 確認訂購狀態
- 處理失敗訂閱
- 處理其它 Stripe Webhooks
- 收據
- 緩存
- 配置
- 緩存用法
- 遞增與遞減
- 緩存標簽
- 緩存事件
- 數據庫緩存
- 集合
- Command Bus
- 建立命令
- 調用命令
- 命令隊列
- 命令管道
- 核心擴展
- 管理者和工廠
- 緩存
- Session
- 認證
- 基于服務容器的擴展
- Laravel Elixir
- 安裝與配置
- 使用方式
- Gulp
- Custom Tasks and Extensions
- 加密
- Envoy 任務執行器
- 安裝
- 執行任務
- 多服務器
- 并行執行
- 任務宏
- 通知
- 更新 Envoy
- 錯誤與日志
- 配置
- 錯誤處理
- HTTP 異常
- 日志
- 事件
- 基本用法
- 事件處理隊列
- 事件訂閱者
- 文件系統與云存儲
- 配置文件
- 基本用法
- 自定義文件系統
- 哈希
- 基本用法
- 輔助方法
- 數組
- 路徑
- 路由
- 字符串
- 網址(URL)
- 其他
- 本地化
- 語言文件
- 基本用法
- 復數
- 驗證
- 覆寫擴展包的語言文件
- 郵件
- 配置
- 基本用法
- 內嵌附件
- 郵件隊列
- 郵件與本地端開發
- 擴展包開發
- 視圖
- 語言
- 配置文件
- 公共資源
- 發布分類文件
- 路由
- 分頁
- 配置
- 使用
- 追加分頁鏈接
- 轉換至 JSON
- 隊列
- 設置
- 基本用法
- 隊列閉包
- 執行一個隊列監聽
- 常駐隊列處理器
- 推送隊列
- 已失敗的工作
- 會話
- 配置
- 使用 Session
- 暫存數據(Flash Data)
- 數據庫 Sessions
- Session 驅動
- 模板
- Blade 模板
- Blade 控制語法結構
- Blade 擴展
- 參考:@section與@yield 介紹
- 單元測試
- 定義并執行測試
- 測試環境
- 從測試調用路由
- 模擬 Facades
- 框架 Assertions
- 輔助方法
- 重置應用程序
- 表單驗證
- 基本用法
- 控制器驗證
- 表單請求驗證
- 使用錯誤信息
- 錯誤信息 & 視圖
- 可用驗證規則
- 條件驗證規則
- 自定義錯誤信息
- 自定義驗證規則
- 數據庫
- 使用基礎
- 配置
- 讀取/寫入連接
- 執行查找
- 數據庫事務處理
- 獲取連接
- 日志記錄
- 查詢構造器
- Selects
- Joins
- 高級 Wheres
- 聚合
- 原生表達式
- 添加
- 更新
- 刪除
- Unions
- 悲觀鎖定 (Pessimistic Locking)
- Eloquent ORM
- 基本用法
- 批量賦值
- 新增,更新,刪除
- 軟刪除
- 時間戳
- 范圍查詢
- Global Scopes
- 關聯
- 關聯查詢
- 預載入
- 新增關聯模型
- 更新上層時間戳
- 使用樞紐表
- 集合
- 獲取器和修改器
- 日期轉換器
- 屬性類型轉換
- 模型事件
- 模型觀察者
- 模型 URL 生成
- 轉換成數組 / JSON
- 結構生成器
- 建立與刪除數據表
- 加入字段
- 修改字段
- 修改字段名稱
- 移除字段
- 檢查是否存在
- 加入索引
- 外鍵
- 移除索引
- 移除時間戳記和軟刪除
- 保存引擎
- 遷移和數據填充
- 建立遷移文件
- 執行遷移
- 回滾遷移
- 數據填充
- Redis
- 配置
- 使用方式
- 管道
- 開發包
- Confide 用戶身份認證
- Entrust 權限管理
- Shoppingcart 購物車
- Genertators 代碼生成工具
- IDE Helper IDE助手
- Artisan 命令行工具
- 概覽
- 用法
- 在命令行接口以外的地方調用命令
- 定時調用 Artisan 命令
- 開發
- 建立自定義命令
- 注冊自定義命令