### 说明
`Zizaco/Entrust` 是 Laravel 下 用户权限系统 的解决方案, 配合 用户身份认证 扩展包 `Zizaco/confide` 使用, 可以快速搭建出一套具备高扩展性的用户系统.
`Confide`, `Entrust`和 `Sentry`
项目地址
> [https://github.com/Zizaco/entrust](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 命令
- 开发
- 建立自定义命令
- 注册自定义命令
- CoverPage