在null上调用成员函数hasRole()

时间:2018-10-13 21:13:44

标签: php laravel-5

我是Laravel新手

我已经在我的应用程序中设置了权限和角色,并将其分配给用户-但是,当我尝试使用hasRole或hasAnyRole时,它对我不起作用。

这是我的“ CheckRole”中间件:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // Get the required roles from the route
        $roles = $this->getRequiredRoleForRoute($request->route());
        // Check if a role is required for the route, and
        // if so, ensure that the user has that role.
        if($request->user()->hasRole('Admin','Receiptionist','Manager','CEO','Root')
        {
            return $next($request);
        }
        return response([
            'error' => [
                'code' => 'INSUFFICIENT_ROLE',
                'description' => 'You are not authorized to access this resource.'
            ]
        ], 401);
    }
    private function getRequiredRoleForRoute($route)
    {
        $actions = $route->getAction();
        return isset($actions['roles']) ? $actions['roles'] : null;
    }
}

这是我的用户模型:

public function role()
{
    return $this->belongsToOne('App\Role', 'id', 'role_id');
}
public function hasRole($roles)
{
    $this->have_role = $this->getUserRole();
    // Check if the user is a root account
    if($this->have_role->name == 'Root') {
        return true;
    }
    if(is_array($roles)){
        foreach($roles as $need_role){
            if($this->checkIfUserHasRole($need_role)) {
                return true;
            }
        }
    } else{
        return $this->checkIfUserHasRole($roles);
    }
    return false;
}
private function getUserRole()
{
    return $this->role()->getResults();
}
private function checkIfUserHasRole($need_role)
{
    return (strtolower($need_role)==strtolower($this->have_role->name)) ? true : false;
}

这是我的榜样:

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model


{
      protected $table = 'role';
      protected $fillable = ['name'];
      protected $primaryKey = 'id';
      public $timestamps = false;
public function users()
{
    return $this->belongsToMany('App\User', 'role_id', 'id');
}
}

我正在尝试运行以下路线:

Route::group(['middleware'=>['authen','roles'],'roles'=>['Root']],function(){
//for Root

Route::get('/createUser',function(){
    echo "This is for Root test";
});

正在产生此错误:

  

FatalThrowableError(E_ERROR)   在null上调用成员函数hasRole()

2 个答案:

答案 0 :(得分:0)

如果您的代码是第一次使用,则尝试将其添加到Kernel.php中一行,我猜一切都会好起来。在您的项目上有不错的代码。 :)

protected $middlewareGroups = [
    'CheckRole' => [
      \App\Http\Middleware\CheckRole::class,
      \Illuminate\Auth\Middleware\Authenticate::class,
],

这意味着您正在尝试检查用户的角色,但是在使用该方法之前您没有登录,这就是您获取null的原因。

答案 1 :(得分:0)

我遇到了同样的问题,结果发现即使用户未登录我也在调用中间件,这意味着 Auth::user() 或在您的情况下 $request->user() 为空。

我是否建议您确保用户已登录