我的申请中有三个角色。我有一个条件,其中两个角色可以访问同一页面。为此我写下面的代码。
在下面的代码中,sub plan1和sub plan 2是角色。
Route::group(['middleware' => ['web', 'auth', 'SubPlan1', 'SubPlan2']], function () {
Route::get('/Parent-1-Info', '\ContactInfoController@Parent1Info'));
});
如果sub plan1尝试访问该页面,我会收到404错误,因为我在同一组中提到了两个中间件。
是否有代码可以在中间件中定义或调整?
答案 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