获取VerifyCsrfToken尝试在添加中间件时获取非对象的属性

时间:2018-06-02 23:04:24

标签: laravel

我正在添加一个中间件,用于检查数据库中的特定权限

中间件

public function handle($request, Closure $next)
{
    $right = User_access_right::where('access_key','=','add')
        ->where('user_id','=',Auth::user()->id)
        ->first();

    if(count($right) == 1)
    {
        if($right->access_value == 1)
        {
            return $next($request);
        }
    }
    else
    {
        return redirect()->to('/home')->withErrors(['status' => 'You do not have privilege to do such task']);
    }
}

现在在控制器中我添加了一些方法。

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('hasAddPrivilege', ['only'=>['CreateCategory', 'CreateSubCategory']]);
    }

在VerifyCsrfToken.php中,我添加了一些不检查令牌的路由

protected $except = [
    '/category/create',
    '/category/update',
    '/category/sub_create',
    '/category/move_category',
    '/item/create',
    '/item/update'
];

我的路线

Route::group(['middleware' => 'auth', 'prefix' => '/category'],     function()
{
Route::get('/', 'CategoryController@Category');
Route::post('/create', 'CategoryController@CreateCategory');
Route::post('/update', 'CategoryController@UpdateCategory');
Route::post('/sub_create', 'CategoryController@CreateSubCategory');
Route::get('/other_category/{id}', 'CategoryController@getRestOfCategories');
Route::post('/move_category', 'CategoryController@MoveCategory');
Route::get('/getCategoryTree', 'CategoryController@getCategoryTree');
});

但我仍然收到此错误;

  
    

VerifyCsrfToken.php第156行中的ErrorException:尝试获取非对象的属性

  

1 个答案:

答案 0 :(得分:1)

您的中间件有一个逻辑分支,根本不会返回任何内容。中间件需要返回响应,以便以前的中间件可以根据需要使用响应来执行操作。他们接受请求并返回回复。

VerifyCsrfToken得到null来自您的中间件的响应,因为根本没有返回任何内容。

在此之后的下一个中间件也可能无法正确返回响应并且正在返回,这将导致同样的问题。

if(count($right) == 1)
{
    if($right->access_value == 1)
    {
        return $next($request);
    }
    // what about when $right->access_value != 1 ?
}