在 Laravel 中,如果已经检查了中间件,我应该检查控制器中的权限吗?

enr*_*qg9 4 php authorization laravel laravel-5 laravel-middleware

我创建了一个中间件,用于检查用户是否有权执行某个操作,并将此中间件添加到我想要保护的路由中,如下所示:

// VerifyPermission middleware

class VerifyPermission {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @param $permission
     * @return mixed
     */
    public function handle($request, Closure $next, $permission)
    {
        $user = auth()->user();

        if (auth()->check() && $user->hasPermission($permission))
        {
            return $next($request);
        }

        return redirect('/');
    }
}

// Routes

Route::patch('company/{id}', ['as' => 'updateCompany',
                              'uses' => 'SettingsController@updateCompany',
                              'middleware' => 'permission:manage_company']
);
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否需要再次检查updateCompany或中间件检查是否足够?

public function updateCompany()
{
    if(Auth::user()->hasPermission('manage_company'))
    {
        // Updates Company
    }   

    return abort(403, "Unauthorized");
}
Run Code Online (Sandbox Code Playgroud)

Mop*_*ppo 5

不,你不应该再做一次检查,中间件会做的。

事实上,处理身份验证和权限处理是中间件最常用的用途之一

当你指定这个时:

Route::patch('company/{id}', ['as' => 'updateCompany',
                          'uses' => 'SettingsController@updateCompany',
                          'middleware' => 'permission:manage_company']
Run Code Online (Sandbox Code Playgroud)

你告诉 laravel,当它找到一条company/{id}路由时,它应该触发中间件的handle方法permission:manage_company然后再将请求发送到SettingsController

因此,当请求到达您的控制器时,您确定它已经满足了它经过的所有中间件