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 权限管理系统
推荐文章: