Laravel 7.x Middlewarecan:gatename它实际上阻止每个人访问特定页面我做错了什么?

问题描述

我尝试制作一个具有管理员,销售和用户权限的授权功能角色。我制定了几个门规则。到目前为止,我做到了。

应用程序\用户

public function Roles()
{
    return $this->belongsToMany('App\Role');
}

public function hasAnyRoles($roles)
{
if ($this->roles()->whereIn('name',$roles)->first()) {
        return true;
    }
        return false;

}

UsersController

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和来自 admin.users.index.PHP

但不是我的想法,它实际上使所有人都从 admin.users.index.PHP

退出

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

解决方法

在门定义中,您拥有

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. 
});

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