Laravel 5.1+ 使用 Entrust 遇到的问题记录
Zizaco/Entrust 是 Laravel 下 用户权限系统
的解决方案,使用此 Package 可以让我们快速接入完整的 RBAC 用户权限管理功能。但是在使用过程中,还是遇到了一些隐藏较深的 Bug, 现记录如下:
1. Laravel User Model 获取问题
通过 composer require zizaco/entrust
方式安装的话,则默认安装 Entrust V1.7(Stable) 版本,但此版本的 EntrustRoleTrait::users() 方法获取 User Model 使用的是 Config::get('auth.providers.users.model') 方式,而 Laravel 5.1 对应的 User Model 却是 'auth.model', 导致在 Laravel 5.1 下无法通过 $role->users() 的方式获取到对应权限的用户。
解决方案
使用 composer require "zizaco/entrust": "5.2.x-dev"
安装 5.2.x-dev 分支或者使用 v1.5.0(Stable) 版本。
2. 使用 $user->delete() 方法始终返回 null
通过 composer require zizaco/entrust
方式安装的话,则默认安装 Entrust V1.7(Stable) 版本,但此版本的 EntrustUserTrait:: delete 方法没有返回值,导致通过 $user->delete() 判断用户是否删除成功的时候始终返回 null, 影响范围包括 save、restore.
解决方案
使用 composer require "zizaco/entrust": "5.2.x-dev"
安装 5.2.x-dev 分支,v1.5.0(Stable) 同样有问题。
3. 与 Authorizable::can 方法冲突
Laravel 在 5.1 版本中提供了 用户授权 功能,此功能可以通过在模型中引入 Authorizable Trait 来实现控制用户访问资源。但因 Entrust 提供的 can 方法和 Authorizable 提供的 can 方法重名,导致程序执行报错。虽然我们可以通过 解决 Entrust 的 Trait 冲突 中提供的方法来解决冲突让程序能够顺利运行,但是这其实只是治标不治本,原因在于尽管我们可以通过设置别名的方式去重新定义冲突的方法,但是一旦 Trait 本身含有有调用冲突方法的逻辑,在执行到调用代码位置时,冲突依然会发生。
PHP 解释器在编译时会把 Trait 复制到类的定义体中,但是不会处理这个操作引入的不兼容问题
Entrust 中 can 方法具体调用位置:
https://github.com/Zizaco/entrust/blob/1.7...
https://github.com/Zizaco/entrust/blob/1.7...
Laravel Authorization 中 can 方法具体调用位置:
https://github.com/laravel/framework/blob/...
解决方案
方案一. 不使用 Laravel Authorization
方案二. fork Entrust 修改 can 方法名称
方案三. 使用 JosephSilber/bouncer 替换 Entrust
bouncer 是以 Laravel Authorization 为基础实现的 RBAC & ACL 权限管理系统
遇到同样的问题,救了我命
绑定角色权限时报了以下错误
Column not found: 1054 Unknown column 'permission_model_id' in 'field list' (SQL: insert into
erp_permission_role
(permission_model_id
,role_model_id
) values (1, 2))“permission_role”表本身自动生成的是permission_id与role_id,现在却跑出来
permission_model_id
,role_model_id
求解@拍个黄瓜 在你的主题里回复了,是因为你的 Role、Permission 分别命名为 RoleModel、PermissionModel, Laravel 在进行模型关联的时候会根据你的类名生成外键,所以报错了。
@Kelvin 但是用户绑定角色就没有这个问题出现啊,我试试看,谢谢
可以试试 Laratrust
这是参考 entrust 改进的项目。
@Destiny
我目前在用 bouncer 基于 Laravel Gate 的 ACL & RBAC 权限扩展
@Kelvin 请问一下 bouncer的abilities表中存在一字段only_owned,这个字段的作用是什么呢?可以稍微告诉我吗,谢谢!
@Rainbow9502
允许用户管理他们自己创建的 models
参考 Allowing a user or role to "own" a model