ПО промежуточного слоя Laravel 5.4 для роли администратора и пользователя

Я создал два промежуточного программного обеспечения под названием «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) и я установил еще в / Admin каталог.

Я чувствую, что это неправильно, как ты думаешь?


person Murlidhar Fichadia    schedule 13.05.2017    source источник
comment
Почему оба перенаправляются на одну и ту же страницу? у вас есть третье лицо, кроме администратора и пользователя? Кто будет перенаправлен на admin / users?   -  person Sapnesh Naik    schedule 13.05.2017


Ответы (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');

}

Вы должны проверить мой подробный ответ по той же теме здесь

person Sapnesh Naik    schedule 13.05.2017
comment
Если есть 5 ролей, тогда я должен создать 5 Middleware для его обработки? Можно ли управлять этим в общем файле? - person user3575353; 25.08.2017
comment
@ user3575353 Я не думаю, что это можно сделать в одном файле, поскольку вы создаете промежуточное программное обеспечение с помощью artisan, и по умолчанию создает новый файл с именем вашего промежуточного программного обеспечения - person Sapnesh Naik; 26.08.2017

Да, это можно сделать в одном общем файле. Вот код

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

Вы можете изменить логику по своему усмотрению.

person Yasir Ijaz    schedule 07.11.2017