В 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:
После внесения изменений, предложенных @ 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>
Как мне изменить этот файл представления, чтобы отправить зарегистрированного пользователя на ДОМУ его роли?