反正有代码,我可以在中间件中定义或条件?

时间:2016-05-28 12:28:38

标签: php laravel laravel-5 laravel-5.1 laravel-5.2

我的申请中有三个角色。我有一个条件,其中两个角色可以访问同一页面。为此我写下面的代码。

在下面的代码中,sub plan1和sub plan 2是角色。

Route::group(['middleware' => ['web', 'auth', 'SubPlan1', 'SubPlan2']], function () {
    Route::get('/Parent-1-Info', '\ContactInfoController@Parent1Info'));
});

如果sub plan1尝试访问该页面,我会收到404错误,因为我在同一组中提到了两个中间件。

是否有代码可以在中间件中定义或调整?

1 个答案:

答案 0 :(得分:1)

对于基于角色的身份验证,我正在使用此中间件:

screen -S 9274 -p 0 -X stuff '(command here)'\015

然后在namespace App\Http\Middleware; use Auth; use Closure; use App\Role; use Illuminate\Support\Collection; class RoleMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next, $roles = null, $guard = null) { $roles = Role::whereIn('slug', explode('|', $roles))->get(); if (! Auth::guard($guard)->user()->hasRole($roles)) { return abort(403, 'Forbidden'); } return $next($request); } }

中注册中间件
Kernel.php

在用户模型上,确保您有一种方法来检查用户是否有一组角色,例如:

'role' => \App\Http\Middleware\RoleMiddleware::class,

你可以使用这样的中间件:

public function hasRole($role)
{
    if (is_int($role)) {
        return $this->roles->contains('id', $role);
    }

    if (is_string($role)) {
        return $this->roles->contains('slug', $role);
    }

    if ($role instanceof Model) {
        return $this->roles->contains('id', $role->id);
    }

    return !! $role->intersect($this->roles)->count();
}

您可以将Route::group(['middleware' => ['auth', 'role:admin|staff'], ...); 替换为您的角色名称,以admin|staff分隔。如果您要添加自定义|,则可以将其作为第二个参数guard

传递