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

时间:2017-05-13 01:41:14

标签: php laravel-5.4 laravel-middleware

我创建了两个名为“MustBeAdmin”和“MustBeUser”的中间件,以确保根据用户登录信息将其重定向到正确的页面并限制未经授权的内容。目前一切正常,重定向也很好。但我在幕后写的逻辑对我来说似乎不对,而且它仍然有效。如果我写出对我来说似乎正确的逻辑,它似乎没有按预期工作。

用户表

id (1,2,3,...)
name
role (1,2,3,...)

角色表

id (1,2,3,...)
role (Student, Admin,...)

MustBeAdmin中间件

public function handle($request, Closure $next)
    {
        if($request->user()->role == 2)
        {
            return $next($request);
        }
        else
        {
            return redirect('/admin/users');
        }

    }

MustBeUser中间件:

public function handle($request, Closure $next)
    { 
        if($request->user()->role == 1)
        {
            return $next($request);
        }
        else
        {
            return redirect('/admin/users');
        }

    }

kernel.php

'admin' => \App\Http\Middleware\MustBeAdmin::class,
'user' => \App\Http\Middleware\MustBeUser::class,

正如您所看到的,我已经在内核中注册了中间件。

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

1 = Student
2 = Admin

如果你在MustBeAdmin中间件中看到我正在比较用户角色是2(管理员)然后做下一个($ request)而在MustBeUser中间件我正在比较用户角色是1(学生)然后做下一个($ request)和我将else设置为/ Admin目录。

我觉得它错了,你怎么看?

2 个答案:

答案 0 :(得分:2)

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

//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');

}

您应该查看我对同一主题here

的详细答案

答案 1 :(得分:1)

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

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);
}

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