我有两种类型的用户,我创建了多个中间件。
某些路由需要允许这两种类型的用户。
我正在尝试以下代码:
Route::group(['namespace' => 'Common', 'middleware' => ['Auth1', 'Auth2']], function() {
Route::get('viewdetail', array('as' => 'viewdetail', 'uses' => 'DashboardController@viewdetail'));
});
但它不起作用:(
答案 0 :(得分:11)
中间件应该返回响应或将请求传递给管道。中间件彼此独立,不应该知道其他中间件运行。
您需要实现一个单独的中间件,允许2个角色或单个中间件将允许的角色作为参数。
选项1 :创建中间件是Auth1和Auth2的组合版本,可检查2种用户类型。这是最简单的选择,虽然不是很灵活。
选项2 :由于版本5.1 中间件可以采用参数 - 请在此处查看更多详细信息:https://laravel.com/docs/5.1/middleware#middleware-parameters。您可以实现一个中间件,该中间件将检查用户角色列表,并在路由文件中定义允许的角色。以下代码应该可以解决问题:
// define allowed roles in your routes.php
Route::group(['namespace' => 'Common', 'middleware' => 'checkUserRoles:role1,role2', function() {
//routes that should be allowed for users with role1 OR role2 go here
});
// PHP < 5.6
// create a parametrized middleware that takes allowed roles as parameters
public function handle($request, Closure $next) {
// will contain ['role1', 'role2']
$allowedRoles = array_slice(func_get_args(), 2);
// do whatever role check logic you need
}
// PHP >= 5.6
// create a parametrized middleware that takes allowed roles as parameters
public function handle($request, Closure $next, ...$roles) {
// $roles will contain ['role1', 'role2']
// do whatever role check logic you need
}
答案 1 :(得分:2)
这个例子 How to pass multiple parameters to middleware with OR condition in Laravel 5.2
不是向handle方法添加多个参数,而是每次向应用程序添加新角色时都必须更新它,您可以将其设置为动态。
<强>中间件强>
/**
* Handle an incoming request.
*
* @param $request
* @param Closure $next
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function handle($request, Closure $next) {
$roles = array_slice(func_get_args(), 2); // [default, admin, manager]
foreach ($roles as $role) {
try {
Role::whereName($role)->firstOrFail(); // make sure we got a "real" role
if (Auth::user()->hasRole($role)) {
return $next($request);
}
} catch (ModelNotFoundException $exception) {
dd('Could not find role ' . $role);
}
}
Flash::warning('Access Denied', 'You are not authorized to view that content.'); // custom flash class
return redirect('/');
}
<强>路线强>
Route::group(['middleware' => ['role_check:default,admin,manager']], function() {
Route::get('/user/{user_id}', array('uses' => 'UserController@showUserDashboard', 'as' => 'showUserDashboard'));
});
这将检查经过身份验证的用户是否至少提供了其中一个角色,如果是,则将请求传递给下一个中间件堆栈。当然,hasRole()
方法和角色本身需要由您实施。
您可以使用php 5.6
public function handle($request, Closure $next, ...$roles)
{
foreach ($roles as $role) {
try {
if ($request->user()->can($role)) {
return $next($request);
}
} catch (ModelNotFoundException $exception) {
abort(403);
}
}
}
答案 2 :(得分:1)
Route::group(['middleware' => 'role:manager,admin'], function () {}
在名为“role”的中间件中,您可以将参数销毁到数组中
public function handle($request, Closure $next, ...$roles)
{
$userRole = $request->user()->role;
if (! $userRole || ! in_array($userRole->name, $roles)) {
abort(403);
}
return $next($request);
}
答案 3 :(得分:0)
简单地说,您可以使用这种语法,这意味着如果其中有一个
Route::group(['middleware' => ['role:first|second|third|....']], function () {});