Laravel Gate Define不适用于角色\u id为1的其他用户
当用户具有角色\u id 1时,中间件中的以下代码工作正常,当我对角色->权限执行dd时,响应为数组 但是在这条线上Laravel Gate Define不适用于角色\u id为1的其他用户,laravel,laravel-8,laravel-authentication,laravel-authorization,laravel-gate,Laravel,Laravel 8,Laravel Authentication,Laravel Authorization,Laravel Gate,当用户具有角色\u id 1时,中间件中的以下代码工作正常,当我对角色->权限执行dd时,响应为数组 但是在这条线上 if (in_array($role->permissions, $permission)) { 对于角色id不同的所有其他用户,我都会遇到此错误 in#array():参数#2($haystack)必须是array类型,在传递数组的位置指定字符串 我的角色模型 protected $casts = [ 'permissions' => 'array
if (in_array($role->permissions, $permission)) {
对于角色id不同的所有其他用户,我都会遇到此错误
in#array():参数#2($haystack)必须是array类型,在传递数组的位置指定字符串
我的角色模型
protected $casts = [
'permissions' => 'array',
];
protected function role()
{
return $this->hasOne(Roles::class, 'id', 'role_id');
}
我的用户模型
protected $casts = [
'permissions' => 'array',
];
protected function role()
{
return $this->hasOne(Roles::class, 'id', 'role_id');
}
我的网络中间件组
\App\Http\Middleware\RolePermissionCheck::class,
我的医疗器械坏了
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
class RolePermissionCheck
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!empty(Auth::user()->role_id)) {
$role = Auth::user()->role;
Gate::before(
function () {
if (Auth::user()->role_id === 1) {
return true;
}
}
);
// dd($role->permissions);
foreach ($role->permissions as $permission) {
Gate::define(
$permission,
function ($role) use ($permission) {
if (in_array($role->permissions, $permission)) {
return true;
}
}
);
}
}
return $next($request);
}
}
不要把我的答案标记为用户告诉你的正确,我将分享一些更好的代码,非常简单和“Laravel方式”的东西 正如用户所说:“问题将出现在
foreach
循环中,用于Gate
定义。在循环的第一次迭代中(基于您的示例数组),您将有$action=0
和$roles='admin\u role\u manage'
。因此Gate的名称将是0
。当然,然后@can('admin\u role\u manage'))
为false
”
因此,您正在设置或获取许多不需要的东西,或者用其他方式表达,您可以拥有更清晰的代码(至少对于
中间件
类)
如果您知道(也许您不知道),您可以将属性建模为您想要的类型,因此您不必执行json\u decode($user\u role->permissions)
,只需执行foreach($user\u role->permissions as$role)
,但在执行此操作之前,您需要强制转换它
因此,您的模型将有一个属性$casts
,如下所示:
protected$casts=[
“权限”=>“数组”,
];
这将允许您执行$model->permissions=['role_1'、'role_2'、…]无需执行$model->permissions=json_encode(['role_1','role_2',…])代码>(这也是处理此问题的Laravel方法)
因此,您的中间件将以如下方式结束:
namespace-App\Http\Middleware;
使用App\Models\User;
使用应用程序\模型\角色;
使用闭包;
使用Illumb\Support\Facades\Auth;
使用照明\支持\立面\大门;
类角色权限检查
{
公共函数句柄($request,Closure$next)
{
如果($role=Auth::user()->role)){
盖特:之前(
函数(用户$User){
如果($user->role\u id=='1'){
返回true;
}
}
);
foreach($role->permissions as$permission){
门::定义(
$permission,
函数($role)使用($permission){
if(在数组中($permission,$role->permissions)){
返回true;
}
}
);
}
}
返回$next($request);
}
}
请注意,我已将$role->permissions as$roles
的措辞更改为$role->permissions as$permission
,您的角色
可以是“作者”,您的权限是时事通讯管理
,品牌标识
,报价管理
,等等。所以这不是角色,而是权限
还请记住,我认为您甚至可以为foreach/define
部分编写更好的代码。请不要将我的答案标记为用户告诉您的正确答案,我将与您分享一些有更好代码的东西,非常简单和“Laravel方式”的东西
正如用户所说:“问题将出现在foreach
循环中,用于Gate
定义。在循环的第一次迭代中(基于您的示例数组),您将有$action=0
和$roles='admin\u role\u manage'
。因此Gate的名称将是0
。当然,然后@can('admin\u role\u manage'))
为false
”
因此,您正在设置或获取许多不需要的东西,或者用其他方式表达,您可以拥有更清晰的代码(至少对于中间件
类)
如果您知道(也许您不知道),您可以将属性建模为您想要的类型,因此您不必执行json\u decode($user\u role->permissions)
,只需执行foreach($user\u role->permissions as$role)
,但在执行此操作之前,您需要强制转换它
因此,您的模型将有一个属性$casts
,如下所示:
protected$casts=[
“权限”=>“数组”,
];
这将允许您执行$model->permissions=['role_1'、'role_2'、…]无需执行$model->permissions=json_encode(['role_1','role_2',…])代码>(这也是处理此问题的Laravel方法)
因此,您的中间件将以如下方式结束:
namespace-App\Http\Middleware;
使用App\Models\User;
使用应用程序\模型\角色;
使用闭包;
使用Illumb\Support\Facades\Auth;
使用照明\支持\立面\大门;
类角色权限检查
{
公共函数句柄($request,Closure$next)
{
如果($role=Auth::user()->role)){
盖特:之前(
函数(用户$User){
如果($user->role\u id=='1'){
返回true;
}
}
);
foreach($role->permissions as$permission){
门::定义(
$permission,
函数($role)使用($permission){
if(在数组中($permission,$role->permissions)){
返回true;
}
}
);
}
}
返回$next($request);
}
}
请注意,我已将$role->permissions as$roles
的措辞更改为$role->permissions as$permission
,您的角色
可以是“作者”,您的权限是时事通讯管理
,品牌标识
,报价管理
,等等。所以