Php 用于管理员和用户角色的Laravel 5.4中间件

Php 用于管理员和用户角色的Laravel 5.4中间件,php,laravel-5.4,laravel-middleware,Php,Laravel 5.4,Laravel Middleware,我创建了两个名为“MustBeAdmin”和“MustBeUser”的中间件,以确保根据用户登录名将它们重定向到正确的页面并限制未经授权的内容。目前一切正常,重定向也很好。但我在幕后写的逻辑对我来说似乎是错误的,而且奇怪的是它仍然有效。如果我写的逻辑至少对我来说是正确的,那么它似乎并不像预期的那样有效 用户表 角色表 MustBeAdmin中间件 MustBeUser中间件: kernel.php 正如您所看到的,我已经在内核中注册了中间件 我得到的结果正是我所需要的,但我怀疑中间件中的逻辑是否

我创建了两个名为“MustBeAdmin”和“MustBeUser”的中间件,以确保根据用户登录名将它们重定向到正确的页面并限制未经授权的内容。目前一切正常,重定向也很好。但我在幕后写的逻辑对我来说似乎是错误的,而且奇怪的是它仍然有效。如果我写的逻辑至少对我来说是正确的,那么它似乎并不像预期的那样有效

用户表 角色表 MustBeAdmin中间件 MustBeUser中间件: kernel.php 正如您所看到的,我已经在内核中注册了中间件

我得到的结果正是我所需要的,但我怀疑中间件中的逻辑是否正确

1 = Student
2 = Admin
如果您看到在MustBeAdmin中间件中,我正在比较用户角色是否为2(管理员),然后执行下一步($request),在MustBeAdmin中间件中,我正在比较用户角色是否为1(学生),然后执行下一步($request),我将else设置为/admin目录


我觉得不对,你怎么看

您没有检查中间件中经过身份验证的用户详细信息。中间件应该类似于:

//for student 
public function handle($request, Closure $next)
{

    if ( Auth::check() && Auth::user()->role == 1 )
    {
        return $next($request);
    }

    return redirect('/admin');

}


//for admin 
public function handle($request, Closure $next)
{

    if ( Auth::check() && Auth::user()->role == 2 )
    {
        return $next($request);
    }

    return redirect('/student');

}

你应该检查我关于同一主题的详细答案

是的,它可以在一个公共文件中处理。 这是密码

public function handle($request, Closure $next)
{
    $user = User::find(Auth::id());
    $roles = [];
    foreach ($user->roles as $key => $value) {
        array_push($roles, $value->pivot->role_id);
    }

    $routeName = Route::getFacadeRoot()->current()->uri();
    $route = explode('/', $routeName);
    if ($route[0] == "teacher") {
        if (in_array(2, $roles)) {
            return $next($request);
        } else {
            return response('Unauthorized.', 401);
        }
    } elseif ($route[0] == "student") {
        if (in_array(1, $roles)) {
            return $next($request);
        } else {
            return response('Unauthorized.', 401);
        }
    } elseif ($route[0] == "admin") {
        if (Auth::user()->admin == 1) {
            return $next($request);
        } else {
            return response('Unauthorized.', 401);
        }
    } else {
        if (!Auth::user()) {
            if ($request->ajax()) {
                    return response('Unauthorized.', 401);
            } else {
                    return redirect()->guest('admin-panel/auth/login');
            }
        }
    }

    return $next($request);
}

您可以根据需要更改逻辑。

为什么两者都重定向到同一页面?除了管理员和用户之外,您还有第三个实体吗?谁将被重定向到管理员/用户?如果有5个角色,那么我应该创建5个中间件来处理它吗?它可以在一个公共文件中管理吗?@user3575353我不认为它可以在单个文件中完成,因为您使用artisan创建了一个中间件,默认情况下,它会创建一个名为您的中间件的新文件
public function handle($request, Closure $next)
    { 
        if($request->user()->role == 1)
        {
            return $next($request);
        }
        else
        {
            return redirect('/admin/users');
        }

    }
'admin' => \App\Http\Middleware\MustBeAdmin::class,
'user' => \App\Http\Middleware\MustBeUser::class,
1 = Student
2 = Admin
//for student 
public function handle($request, Closure $next)
{

    if ( Auth::check() && Auth::user()->role == 1 )
    {
        return $next($request);
    }

    return redirect('/admin');

}


//for admin 
public function handle($request, Closure $next)
{

    if ( Auth::check() && Auth::user()->role == 2 )
    {
        return $next($request);
    }

    return redirect('/student');

}
public function handle($request, Closure $next)
{
    $user = User::find(Auth::id());
    $roles = [];
    foreach ($user->roles as $key => $value) {
        array_push($roles, $value->pivot->role_id);
    }

    $routeName = Route::getFacadeRoot()->current()->uri();
    $route = explode('/', $routeName);
    if ($route[0] == "teacher") {
        if (in_array(2, $roles)) {
            return $next($request);
        } else {
            return response('Unauthorized.', 401);
        }
    } elseif ($route[0] == "student") {
        if (in_array(1, $roles)) {
            return $next($request);
        } else {
            return response('Unauthorized.', 401);
        }
    } elseif ($route[0] == "admin") {
        if (Auth::user()->admin == 1) {
            return $next($request);
        } else {
            return response('Unauthorized.', 401);
        }
    } else {
        if (!Auth::user()) {
            if ($request->ajax()) {
                    return response('Unauthorized.', 401);
            } else {
                    return redirect()->guest('admin-panel/auth/login');
            }
        }
    }

    return $next($request);
}