Получение пустого массива $ role в промежуточном программном обеспечении CheckRole - PullRequest
0 голосов
/ 10 февраля 2020

У меня проблема с проверкой пользовательских ролей в промежуточном программном обеспечении, получая пустой массив $ role

Пользователь. 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);
    }

веб. 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

Роль. php Роли Модель

 protected $table =['roles'];

protected $fillable =['title'];

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

В промежуточном программном обеспечении CheckRole.php вы вызываете метод $request->user()->hasRole($roles), то есть у вас нет функции hasRole() в вашей пользовательской модели и не передано никаких аргументов. Вы можете попробовать мой подход здесь, если у вас есть только 1 роль

Пользователь. 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
}
0 голосов
/ 10 февраля 2020

Вы можете использовать

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...