Laravel中用户角色的中间件

时间:2016-05-21 08:33:41

标签: laravel middleware

我正在创建一个管理面板,我对访问有问题,我使用一对多关系,我的表用户有role_id=3

此中间件工作正常但我需要正确保护路由。

class Administrador
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->guest()) {
            if ($request->ajax()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('/administrador');
            }
        }

        return $next($request);
    }
}

路线设置正确,但我不知道如何在此中间件中发送用户角色。

1 个答案:

答案 0 :(得分:1)

...

修改

如果你想在一个中间件Administrador中合并,那就是:

class Administrador
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $roles = null, $guard = null)
    {
        if (Auth::guard($guard)->guest()) {
            if ($request->ajax()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('/administrador');
            }
        }

        $roles = explode('|', $roles);

        if (! in_array(Auth::guard($guard)->user()->role_id, $roles) {
            return response('Unauthorized.', 401);
        }

        return $next($request);
    }
}

路线上的使用示例:

Route::group(['middleware' => 'administrador:1|2'], function () {});

administrador:1|2将值替换为|分隔的角色ID,如果您想使用其他guard,则可以将其作为第二个参数传递,例如:administrador:1|2,custom_guard 。这样,您就可以定义多个能够访问管理界面的角色。

如果您更愿意使用一个固定角色:

class Administrador
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->guest()) {
            if ($request->ajax()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('/administrador');
            }
        }

        if (Auth::guard($guard)->user()->role_id !== 3) {
            return response('Unauthorized.', 401);
        }

        return $next($request);
    }
}