Я работаю над приложением, где у меня есть три типа пользователей (реальный сценарий), в приложении есть три области: фрилансеры и Lms (системы управления обучением) и панель администратора для обоих:
В настоящее время я не использую какие-либо функции множественной аутентификации, и всякий раз, когда я вхожу в систему в разделе фрилансера и захожу в раздел lms, аутентифицированный пользователь там доступен.
Поскольку я использую только одну таблицу для пользователей, где у меня есть столбец userType
(Который не используется, но есть для проверки в будущем).
Я знаю пару пакетов этот. который я могу реализовать, но я не сделал и подумал, что может быть лучший способ и stackoverflow
сообщество может предоставить один.
Мой вопрос заключается в том, как справиться с ситуацией такого типа. Какой самый эффективный и надежный способ?
Вероятно, вы ищете не multiauth, а разрешения для определенных страниц. Взгляни на: https://github.com/spatie/laravel-permission
Это очень просто и понятно. Он даже позволяет выделить пользователей, которые, например, оба имеют уровень администратора, но только один может просматривать его.
Наиболее эффективным и надежным способом является использование простых user_type
колонка для хранения типа пользователя и создания некоторых помощников. Например, чтобы проверить, является ли пользователь администратором, вы можете создать что-то подобное в User
модель:
public function isAdmin()
{
return auth()->check() && auth()->user()->user_type === 3;
}
Это самый простой метод с большим количеством преимуществ. Это хорошо для приложений, которые используют много отношений, это хорошо для скорости и т. Д.
Вот как бы я это сделал.
Я собираюсь пропустить подробные сведения о настройке контроллеров аутентификации и представлений. Они довольно просты, чтобы подмостить, используя ремесленную консоль.
Первое, что нам нужно, это новое поле на вашем Users
Таблица. admin
поле, если у вас есть только два уровня (админ и не админ). Значение ENUM в вашем случае.
В зависимости от значения в этом поле вы хотите предоставить (или нет) доступ к определенным разделам / страницам / ресурсам и т. Д.
Консоль ремесленника генерирует все необходимые страницы, промежуточное программное обеспечение, маршруты для базового входа в систему. Но после того, как вы это сделаете, вам понадобится второе промежуточное ПО для проверки разных уровней доступа. Давай называть это CheckAdmin
,
Используйте следующую команду
php artisan make:middleware CheckAdmin
, Это создает новое промежуточное ПО с указанным именем в app\Http\Middleware
Теперь зарегистрируйте промежуточное ПО в Kernel.php
(Последняя строка кода). Это дает промежуточному классу, который мы только что создали имя (в данном случае admin).
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'admin' => \App\Http\Middleware\CheckAdmin::class,
];
Все маршруты в вашей проверке для определенных прав администратора должны использовать admin
промежуточное программное обеспечение, которое мы только что зарегистрировали сразу после auth
Заводское промежуточное ПО, снабженное Laravel. Есть два способа сделать это в зависимости от того, как вы создаете свое приложение / веб-сайт.
A. НЕ использовать контроллеры ресурсов для маршрута.
Перейти к вашим маршрутам web.php
файл. И зарегистрировать auth
а также admin
промежуточное программное обеспечение для запроса. Пример следует.
Route::get('/example-admin-only-route', function () { //SOME LOGIC
})->middleware('auth', 'admin');
Б. Использование ресурсов контроллеров. (Что вы, вероятно, должны, когда вы можете)
В конструкторе контроллера ресурсов. ExampleController.php
за наших пример ресурс.
class ExampleController extends Controller
{
public function __construct()
{
$this->middleware('auth');
$this->middleware('admin');
}
...
}
Напишите логику для вашего CheckAdmin
промежуточное программное обеспечение.
namespace App\Http\Middleware;
use Closure;
class CheckAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if($request->user()->admin == 'Admin') //or FreeLancers or LMS (or maybe Unicorns)
{
return $next($request);
}
else
{
return redirect("/not-worthy");
}
}
}
Код проверяет права администратора и либо пропускает запрос, либо делает что-то еще с ним. В нашем случае перенаправляет на другую конечную точку. Но вы можете захотеть сделать более творческие вещи с этим.
Приветствия.