Laravel 7.x Middleware(can:gatename) 它实际上阻止每个人访问某个页面。我做错啥了?

Posted

技术标签:

【中文标题】Laravel 7.x Middleware(can:gatename) 它实际上阻止每个人访问某个页面。我做错啥了?【英文标题】:Laravel 7.x Middleware(can:gatename) it actually prevent everyone to access a certain page. What did i do wrong?Laravel 7.x Middleware(can:gatename) 它实际上阻止每个人访问某个页面。我做错什么了? 【发布时间】:2020-09-02 03:22:22 【问题描述】:

我尝试创建一个包含管理员、销售和用户的授权功能角色。我制定了几条登机规则。到目前为止,我已经做到了。

应用\用户

public function Roles()

    return $this->belongsToMany('App\Role');


public function hasAnyRoles($roles)

if ($this->roles()->whereIn('name', $roles)->first()) 
        return true;
    
        return false;


用户控制器

public function index()

    $users= User::all();
    return view('admin.users.index')->with('users', $users);
and the other user's role as well.

AuthServiceProvider

Gate::define('manageUsers', function($user)
    return $user->hasAnyRoles(['admin, sales']);
);

路线\网络

Route::namespace('Admin')->prefix('admin')->name('admin.')->middleware('can:manageUsers')->group(function()

    Route::resource('/users', 'UsersController', ['except' =>['show', 'store', 'create']]);
);

这就是问题

->中间件('can:manageUsers')

在我把它放到我的路由中后,我无法访问 admin.users.index.php,我想我想踢除管理员之外的任何其他用户角色,以及来自 admin.users.index.php

但与我想的不同,它实际上将所有人从 admin.users.index.php

中踢了出去

帮助!如何让管理员和销售角色可以进入admin.users.index.php

【问题讨论】:

【参考方案1】:

在你的门定义中,你有

Gate::define('manageUsers', function($user)
   return $user->hasAnyRoles(['admin, sales']); //array contains one value 'admin, sales' theres no role like that
);

应该是

Gate::define('manageUsers', function($user)
  return $user->hasAnyRoles(['admin', 'sales']); //array listed with 2 items. 
);

由于您的登机口检查当前正在检查用户是否具有名为“admin, sales”的角色,因此检查将返回 false。当然,belongsToMany 的假设是您的用户将拥有许多角色,并且每个单独的角色(例如“admin”和“sales”)都通过 belongsToMany 关系附加到用户

【讨论】:

很高兴我能帮上忙

以上是关于Laravel 7.x Middleware(can:gatename) 它实际上阻止每个人访问某个页面。我做错啥了?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel5.1 中间件-middleware

laravel middleware

laravel中间件 middleware

laravel框架的中间件middleware的详解

php Laravel Middleware路线和请求信息

在 Laravel 中,如何在 Route::middleware 组中使用“cannot”?