【问题标题】:Getting empty $roles array in CheckRole middleware在 CheckRole 中间件中获取空的 $roles 数组
【发布时间】:2020-02-27 20:41:13
【问题描述】:

我在检查中间件中的用户角色时遇到问题,得到空的 $roles 数组

User.php 模型

protected $fillable = [
    'name', 'email', 'password','role_id',
];

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

CheckRole.php 中间件

public function handle($request, Closure $next, ...$roles)
{       
echo "<pre>"; print_r($roles); die();

       if($request->user()->hasRole($roles) || !$roles)
        {
            return $next($request);
        }

        abort(404);
    }

web.php

 Route::get('/home', 'HomeController@index')->name('home');
    Route::group(['middleware' => ['auth', 'roles'], 'roles:admin'], function () {
    //echo "admin"; die();
    Route::get('/abc', function () {
       echo"sds";
    });

    });

https://gist.github.com/amochohan/8cb599ee5dc0af5f4246

Role.php 角色​​模型

 protected $table =['roles'];

protected $fillable =['title'];

【问题讨论】:

  • 您是否在kernel.php 文件中将'roles' =&gt; \App\Http\Middleware\YOUR_MIDDLEWARE_CLASS_NAME::class, 添加到$routeMiddleware 属性?
  • 是的,我已经在 $routeMiddleware 中添加了
  • 您的用户是否只有 1 个角色?
  • 没有用户拥有多个角色
  • 所以如果你的用户有多个角色你必须使用public function roles() { return $this-&gt;hasMany('App\Role'); }

标签: php laravel


【解决方案1】:

你可以使用

//...
Route::middleware('auth', 'roles:admin')->group(function () {

    // This route is protected by auth & admin middlewares
    Route::get('/abc', function () {
       dump('abc');
    });

});

CheckRole 中间件

class CheckRole
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }

        return $next($request);
    }

}

【讨论】:

  • 我想在 web.php 中查看角色
【解决方案2】:

CheckRole.php 中间件中,您正在调用方法$request-&gt;user()-&gt;hasRole($roles),即您的用户模型中没有hasRole() 函数,也没有传递任何参数。 如果只有 1 个角色,您可以在这里尝试我的方法

User.php

public function hasRole()
{
    return $this->hasOne('App\Role','id','role_id');
}

在您的自定义中间件中

public function handle($request, Closure $next)
{
    if(Auth::user()->hasRole->role_name == "whatever role you want")
    {
        return $next($request);
    }
    //redirect to everywhere you want
}

如果你的用户有多个角色,试试这个 用户.php

public function roles()
{
    return $this->hasMany('App\Role','id','role_id');
}

public function hasRole(string $role)
{
    $roles = $this->roles();
    foreach($roles as $permission)
    {
        if($permission->role_name == $role)
        {
          return true;
        }
    }
    return false;
}

在你的中间件中这样做

public function handle($request, Closure $next)
{
    if(Auth::user()->hasRole("whatever role"))
    {
        return $next($request);
    }
    //redirect to everywhere you want
}

【讨论】:

  • 哦,我忘记了,在 $permission 中只需获取数据库中的属性 $permission->role_name;我编辑了我的答案。
猜你喜欢
  • 2019-06-28
  • 1970-01-01
  • 2019-01-22
  • 2020-09-20
  • 1970-01-01
  • 2018-07-01
  • 2014-10-03
  • 2020-02-04
  • 2016-04-15
相关资源
最近更新 更多