Laravel: Как убедиться, что пользователь переходит в домашний вид для конкретной роли после регистрации и после входа в систему? - PullRequest
1 голос
/ 28 марта 2019

В laravel-5.8 я создал специальную систему мультиавторизации для веб-сайта колледжа, где каждый пользователь регистрируется на определенную роль: администратор, факультет или HOD (руководитель отдела).

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

php artisan make:auth

После регистрации все пользователи перенаправляют на домашнюю страницу по умолчанию, независимо от их ролей. Эти 3 роли хранятся в таблице Users как 0, 1 и 2 под ролью столбца. Я изменил таблицу Users, которая поставляется по умолчанию.

Мой механизм входа работает хорошо. Пользователи перенаправляются на домашнюю страницу своей роли. Вот как я это делаю:

LoginController.php

public function login(Request $request){
if(Auth::attempt(['PID' => $request->PID, 'password' => $request->password])){

    $user = User::where('PID',$request->PID)->first();

    if($user->role == '0'){
        return redirect('home');
    }
    else{
        if($user->role == '1'){
            return redirect('hodhome');
        }
        else{
            return redirect('adminhome');
        }
    }
}
return redirect()->back();
}

Это маршрут, используемый по запросу POST от login.blade.php

Route::post('/login/custom', 'auth\LoginController@login')->name('login.custom');

Но каждый раз, когда я регистрирую нового пользователя, он перенаправляет пользователей на домашнюю страницу факультета, даже если они администраторы или HODы. Вот регистрационный механизм:

RegisterController.php (просто показаны соответствующие функции ниже)

use RegistersUsers;
protected $redirectTo = '/home';
public function __construct()
{
    $this->middleware('guest');
}
//validator function and create function after this line

Я попытался заставить его работать должным образом, выполнив следующее: заменив переменную redirectTo на функцию. // идея: заменить "protected $ redirectTo = '/ home';" по ...

protected function redirectTo(array $data){
    if($data['role']=='0'){ return redirect('home'); }
    elseif($data['role']=='1'){ return redirect('hodhome'); }
    else return redirect('adminhome');
}

Но это не работает, потому что я, кажется, что-то упустил.

Еще одним обломом является тот факт, что после входа пользователи могут получать доступ к домашним страницам других ролей. middleware('auth') в моих маршрутах помогает защитить от доступа к URL-адресам, когда они не вошли в систему, но это не мешает зарегистрированным пользователям получать доступ к другим домашним страницам.

Вот маршруты к домашним страницам:

Auth::routes();

//-------------------MULTI AUTH SYSTEM------------------------------------------

Route::post('/login/custom', 'auth\LoginController@login')->name('login.custom');

Route::get('/home', 'HomeController@index')->name('home');

route::get('/adminhome', function () {
    return view('adminhome');
})->middleware('auth');

route::get('/hodhome', function () {
    return view('hodhome');
})->middleware('auth');
//----------------------------------------------------------------------------

По умолчанию welcome.blade.php слишком перенаправляет зарегистрированных пользователей на домашнюю страницу факультета:

@if (Route::has('login'))
        <div class="top-right links">
            @auth
                <a href="{{ url('/home') }}">Home</a>
            @else
                <a href="{{ route('login') }}">Login</a>

                @if (Route::has('register'))
                    <a href="{{ route('register') }}">Register</a>
                @endif
            @endauth
        </div>
    @endif

  1. Как сделать так, чтобы пользователи переходили на правильные домашние страницы после новой регистрации и входа в систему?
  2. Как сделать так, чтобы домашняя страница одной роли оставалась недоступной для других ролей?

РЕДАКТИРОВАТЬ 1:

После внесения изменений, предложенных @ N69S, вот что происходит:

  • страницы стали специфичными для ролей.
  • одна роль не может получить доступ к страницам другой роли, а неаутентифицированные пользователи не могут просматривать никакие страницы, кроме страницы приветствия.

Это решение сработало. Но при попытке нелегального доступа к URL, должна быть сгенерирована ошибка. Но вместо этого пользователь отправляется на страницу приветствия. Эта страница содержит только одну ссылку в правом верхнем углу, которая называется "HOME" . Эта ссылка не работает, когда пользователь admin или HOD вошел в систему, потому что он маршрутизирует к '/home', как показано:

//welcome.blade.php
<body>
    <div class="flex-center position-ref full-height">
        @if (Route::has('login'))
            <div class="top-right links">
                @auth
                    <a href="{{ url('/home') }}">Home</a>
                @else
                    <a href="{{ route('login') }}">Login</a>

                    @if (Route::has('register'))
                        <a href="{{ route('register') }}">Register</a>
                    @endif
                @endauth
            </div>
        @endif

        <div class="content">
            <div class="title m-b-md text-center">
                COLLEGE ADMINISTRATION <br> SYSTEM
            </div>
        </div>
    </div>
</body>

Как мне изменить этот файл представления, чтобы отправить зарегистрированного пользователя на ДОМУ его роли?

1 Ответ

0 голосов
/ 28 марта 2019

Одно полное и правильное решение состояло бы в том, чтобы отделить сущности (HOD, Admin, User) и настроить аутентификацию для каждой из них (auth: hod, auth: admin, auth)

Другим решением было бы создать 3 отдельных промежуточных ПО и сгруппировать ваши маршруты с одним из них соответственно.

Кстати, redirectTo() метод не принимает параметры. От Illuminate\Foundation\Auth\RedirectsUsers черта

/**
 * Get the post register / login redirect path.
 *
 * @return string
 */
public function redirectPath()
{
    if (method_exists($this, 'redirectTo')) {
        return $this->redirectTo();
    }

    return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}

--------------- Edit

Для решения промежуточного программного обеспечения 3 вы можете использовать команду php artisan make:middleware Admin, это создаст файл класса app/Http/ Middleware/Admin.php.

в методе handle вы можете сделать что-то вроде

public function handle($request, Closure $next)
{
    if(auth()->user() && auth()->user()->role == 2){
        return $next($request);
    }
    return redirect(‘login’)->with(‘error’,’You have not admin access’);
}

и сделать то же самое для HOD

Чтобы использовать его как auth в маршрутах, добавьте промежуточное программное обеспечение в ядре App\Http\Kernel.php в $routeMiddleware

protected $routeMiddleware = [
    //....,
    //....,
    'admin' => \App\Http\Middleware\Admin::class,
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...