1、安装
想要在Laravel中使用Entrust,首先需要通过Composer来安装其依赖包:
composer require zizaco/entrust 5.2.x-dev
安装完成后需要在config/app.php中注册服务提供者到providers数组:
Zizaco\Entrust\EntrustServiceProvider::class,
同时在该配置文件中注册相应门面到aliases数组:
'Entrust' => Zizaco\Entrust\EntrustFacade::class,
如果你想要使用中间件(要求Laravel 5.1或更高版本)还需要添加如下代码到app/Http/Kernel.php的routeMiddleware数组:
'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,
2、配置
在配置文件config/auth.php中设置合适的值,Entrust会使用这些配置值来选择相应的用户表和模型类。
你还可以发布该扩展包的配置以便后续自定义相关表名以及模型类的命名空间:
php artisan vendor:publish
该命令会在config目录下创建一个entrust.php文件。
3、用户角色权限表
接下来我们使用Entrust提供的迁移命令生成迁移文件:
php artisan entrust:migration
然后通过以下命令生成相应的数据表:
php artisan migrate
最终会生成4张新表:
roles—— 存储角色
permissions—— 存储权限
role_user—— 存储角色与用户之间的多对多关系
permission_role—— 存储角色与权限之间的多对多关系
4、模型类
Role
我们需要创建Role模型类app/Models/Role.php并编辑其内容如下:
use Zizaco\Entrust\EntrustRole;
class Role extends EntrustRole{}
Role模型拥有三个主要属性:
name—— 角色的唯一名称,如“admin”,“owner”,“employee”等
display_name—— 人类可读的角色名,例如“后台管理员”、“作者”、“雇主”等
description—— 该角色的详细描述
display_name和description属性都是可选的,在数据库中的相应字段默认为空。
Permission
接下来创建Permission模型app/models/Permission.php并编辑其内容如下:
use Zizaco\Entrust\EntrustPermission;
class Permission extends EntrustPermission{}
Permission模型也有三个主要属性:
name—— 权限的唯一名称,如“create-post”,“edit-post”等
display_name—— 人类可读的权限名称,如“发布文章”,“编辑文章”等
description—— 该权限的详细描述
User
接下来我们在User模型中使用EntrustUserTrait:
use Zizaco\Entrust\Traits\EntrustUserTrait;
class User extends Eloquent{
use EntrustUserTrait; // add this trait to your user model
...
}
这将会建立User与Role之间的关联关系:在User模型中添加roles()、hasRole($name)、can($permission)以及ability($roles,$permissions,$options)方法。
软删除
使用Entrust提供的迁移命令生成的关联关系表中默认使用了onDelete('cascade')以便父级记录被删除后会移除其对应的关联关系。如果你由于某种原因不能在数据库中使用级联删除,那么可以EntrustRole、EntrustPermission类以及HasRole trait提供的事件监听器手动删除关联表中的记录。如果模型使用了软删除,那么当不小心误删除数据时,事件监听器将不会删除关联表数据。然而,由于Laravel事件监听器的局限性,所以暂时无法区分是调用delete()还是forceDelete(),基于这个原因,在你删除一个模型之前,必须手动删除所有关联数据(除非你的数据表使用了级联删除):
$role = Role::findOrFail(1); // Pull back a given role
// Regular Delete
$role->delete(); // This will work no matter what
// Force Delete
$role->users()->sync([]); // Delete relationship data
$role->perms()->sync([]); // Delete relationship data
$role->forceDelete(); // Now force delete will work regardless of whether the pivot table has cascading delete
1、创建角色/权限并进行分配
首先我们来创建Role和Permission:
$owner = new Role();
$owner->name = 'owner';
$owner->display_name = 'Project Owner';
$owner->description = 'User is the owner of a given project';
$owner->save();
$admin = new Role();
$admin->name = 'admin';
$admin->display_name = 'User Administrator';
$admin->description = 'User is allowed to manage and edit other users';
$admin->save();
接下来我们将创建的两个roles分配给用户:
$user = User::where('username', '=', 'michele')->first();
//调用hasRole提供的attachRole方法
$user->attachRole($admin); // 参数可以是Role对象,数组或id
// 或者也可以使用Eloquent原生的方法
$user->roles()->attach($admin->id); //只需传递id即可
现在我们还需要添加相应权限到这些角色上:
$createPost = new Permission();
$createPost->name = 'create-post';
$createPost->display_name = 'Create Posts';
$createPost->description = 'create new blog posts';
$createPost->save();
$editUser = new Permission();
$editUser->name = 'edit-user';
$editUser->display_name = 'Edit Users';
$editUser->description = 'edit existing users';
$editUser->save();
$admin->attachPermission($createPost);
//等价于 $admin->perms()->sync(array($createPost->id));
$owner->attachPermissions(array($createPost, $editUser));
//等价于 $owner->perms()->sync(array($createPost->id, $editUser->id));
2、检查角色&权限
完成上述操作后,下面我们可以检查相应角色和权限:
$user->hasRole('owner'); // false
$user->hasRole('admin'); // true
$user->can('edit-user'); // false
$user->can('create-post'); // true
hasRole()和can都可以接收数组形式的角色和权限进行检查:
$user->hasRole(['owner', 'admin']); // true
$user->can(['edit-user', 'create-post']); // true
默认情况下,如果用户拥有以上任意一个角色或权限都会返回true,如果你想检查用户是否拥有所有角色及权限,可以传递true作为第二个参数到相应方法:
$user->hasRole(['owner', 'admin']); // true
$user->hasRole(['owner', 'admin'], true); // false
$user->can(['edit-user', 'create-post']); // true
$user->can(['edit-user', 'create-post'], true); // false
用户可以拥有多个角色。
除此之外,还可以通过Entrust门面检查当前登录用户是否拥有指定角色和权限:
Entrust::hasRole('role-name');
Entrust::can('permission-name');
甚至还可以通过通配符的方式来检查用户权限:
// match any admin permission
$user->can("admin.*"); // true
// match any permission about users
$user->can("*_users"); // true