我个人会使用中间件和路由组来完成任务,这类似于 Laravel 检查用户身份验证的方式。
您只需要确定何时需要运行中间件,这可以通过嵌套 Route::group 或从控制器注入中间件来完成。
因此,对于嵌套的示例,您可以在路由文件中包含以下内容:
Route::group(['middleware' => ['auth']], function () {
Route::get('dashboard', ['as' => 'dashboard', function () {
return view('dashboard');
}]);
Route::group(['prefix' => 'company', 'namespace' => 'Company', 'middleware' => ['App\Http\Middleware\HasRole'], function () {
Route::get('dashboard', ['as'=>'dashboard', function () {
return view('company.dashboard');
}]);
Route::resource('employees', 'EmployeesController');
...
...
});
});
或者您可以像这样将中间件注入您的控制器:
use Illuminate\Routing\Controller;
class AwesomeController extends Controller {
public function __construct()
{
$this->middleware('hasRole', ['only' => 'update'])
}
}
然后使用php artisan make:middleware HasRole 之类的东西添加一个或多个中间件文件,这将为您提供中间件样板,然后您可以添加角色检查逻辑:
<?php namespace App\Http\Middleware;
use Closure;
class HasRole {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if($request->is('admin/*')){
[******ADD YOUR LOGIC HERE TO DETERMINE THE ROLE ******]
[******YOU CAN ALSO INCLUDE ANY REDIRECTS IF NECESSARY******]
}
return $next($request);
}
}
请注意,我使用$route->is('admin/*') 过滤任何路由作为进一步过滤请求的示例,如果您从控制器注入中间件,您可能不会包含这些请求。
但如果用户通过了所需的角色检查,您无需执行任何操作,他们将被允许继续查看。如果他们未能通过角色检查,您可以相应地进行处理,但请注意不要让他们陷入失败的权限循环。
我想您已经了解了它的要点,请随时查看Laravel middleware docs 了解更多信息。