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 权限管理系统

本帖已被设为精华帖!
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 25

遇到同样的问题,救了我命

3年前 评论

绑定角色权限时报了以下错误
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求解

3年前 评论

@拍个黄瓜 在你的主题里回复了,是因为你的 Role、Permission 分别命名为 RoleModel、PermissionModel, Laravel 在进行模型关联的时候会根据你的类名生成外键,所以报错了。

3年前 评论

@Kelvin 但是用户绑定角色就没有这个问题出现啊,我试试看,谢谢

3年前 评论
Destiny

可以试试 Laratrust

3年前 评论
Destiny

这是参考 entrust 改进的项目。

3年前 评论

@Destiny
我目前在用 bouncer 基于 Laravel Gate 的 ACL & RBAC 权限扩展

3年前 评论

@Kelvin 请问一下 bouncer的abilities表中存在一字段only_owned,这个字段的作用是什么呢?可以稍微告诉我吗,谢谢!

1年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!