В этой статье мы шаг за шагом рассмотрим как на laravel сделать множественную авторизацию.
- План работы
- Шаг 01: Установка Laravel 6
- Шаг 02: установите Laravel UI
- Шаг 03: Настройка Базы Данных
- Шаг 04: Миграция
- Шаг 05: Настройка Модели
- Шаг 06: настройка auth.php
- Шаг 07: определение маршрутов
- Шаг 08: контроллер аутентификации администратора
- Шаг 09: форма входа администратора
- Шаг 10: обработка несанкционированного перенаправления администратора
План работы
Мы сделаем систему аутентификации для 2-х групп пользователей обычным пользователем и администратором. Для обычного пользователя мы используем auth scaffold по умолчанию, а для администратора нам нужно сделать чуть по другому
- Шаг 01: Установка Laravel 6
- Шаг 02: установите Laravel UI
- Шаг 03: Настройка Базы Данных
- Шаг 04: Миграция
- Шаг 05: Настройка Модели
- Шаг 06: настройка auth.php config
- Шаг 07: определение маршрутов
- Шаг 08: контроллер аутентификации администратора
- Шаг 09: форма входа администратора
- Шаг 10: обработка несанкционированного перенаправления администратора
Шаг 01: Установка Laravel 6
Установите Laravel 6 с помощью этой команды. Вы можете сделать то же самое и в Laravel >5.5 версии.
composer create-project --prefer-dist laravel/laravel project-name
Шаг 02: установите Laravel UI
В Laravel 6 по умолчанию make:auth
эта команда недоступна. Вы должны установить пакет laravel/ui
для создания auth scaffold. Имейте в виду, что это требуется только в том случае, если вы используете версию Laravel 6, иначе вам придется пропустить этот шаг.
composer require laravel/ui --dev
php artisan ui bootstrap --auth
Шаг 03: Настройка Базы Данных
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dbname
DB_USERNAME=root
DB_PASSWORD=
Шаг 04: Миграция
Сделайте копию файла миграции пользователя с именем 2014_10_12_000000_create_admins_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdminsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('admins');
}
}
сохраните файл и запустите миграцию.
php artisan migrate
Шаг 05: Настройка Модели
Создайте модель администратора. Здесь мы скопировали модель пользователя и сделали некоторые изменения.
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Admin extends Authenticatable
{
use Notifiable;
protected $guard = 'admin';
protected $fillable = [
'name', 'email', 'username', 'password','email_verfied_at'
];
protected $hidden = ['password'];
}
В этой модели администратора у нас есть параметр $guard = 'admin'
, который мы настроим в config\auth.php позже.
Шаг 06: настройка auth.php
Добавьте новый guard для администратора в разделе guards.
'guards' => [
...
...
'admin' => [
'driver' => 'session',
'provider' => 'admins',
]
];
Добавьте нового поставщика в разделе поставщика для admin guard provider.
'providers' => [
...
...
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
]
];
Шаг 07: определение маршрутов
Route::namespace('Admin')->name('admin.')->prefix('admin')->group(function () {
Route::get('login', 'AdminAuthController@getLogin')->name('login');
Route::post('login', 'AdminAuthController@postLogin');
})
Шаг 08: контроллер аутентификации администратора
Давайте сделаем контроллер для аутентификации администратора с отдельной папкой администратора. Так что наши контроллеры, связанные с администратором, будут находиться в одном пространстве имен.
<?php
namespace App\Http\Controllers\Admin;
use App\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
class AdminAuthController extends Controller
{
use AuthenticatesUsers;
protected $guardName = 'admin';
protected $maxAttempts = 3;
protected $decayMinutes = 2;
protected $loginRoute;
public function __construct()
{
$this->middleware('guest:admin')->except('postLogout');
$this->loginRoute = route('admin.login');
}
public function getLogin()
{
return view('admin.login');
}
public function postLogout()
{
Auth::guard($this->guardName)->logout();
Session::flush();
return redirect()->guest($this->loginRoute);
}
public function postLogin(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:5'
]);
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
$this->sendLockoutResponse($request);
}
$credential = [
'email' => $request->input('email'),
'password' => $request->input('password')
];
if (Auth::guard($this->guardName)->attempt($credential)) {
$request->session()->regenerate();
$this->clearLoginAttempts($request);
return redirect()->intended();
} else {
$this->incrementLoginAttempts($request);
return redirect()->back()
->withInput()
->withErrors(["Incorrect user login details!"]);
}
}
}
Шаг 09: форма входа администратора
Здесь я показываю только форму входа в систему с минимальным дизайном.
<form method="POST" action="" method="POST">
@csrf
<div class="form-group">
<p>Email</p>
<input class="form-control" name="email" type="email" required value="">
</div>
<div class="form-group">
<p>Password</p>
<input class="form-control" name="password" type="password" required>
</div>
<div class="form-group">
<button class="btn btn-primary" type="submit">Login</button>
</div>
</form>
Шаг 10: обработка несанкционированного перенаправления администратора
Если кто-то попытается получить доступ к admin routes без входа в систему в качестве администратора, то по умолчанию он будет перенаправлен на вход пользователя, но наша цель-перенаправить на наш желаемый маршрут для входа в систему администратора. Для этого мы должны изменить unauthenticated
метод в app/Exceptions/Handler.php
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
$guard = Arr::get($exception->guards(), 0);
switch ($guard) {
case 'admin':
$login = 'admin/login';
break;
default:
$login = 'login';
break;
}
return redirect()->guest(url($login));
}
Наша система множественной аутентификации готова к использованию. Мы используем middleware для защиты административных маршрутов либо в файле маршрутов, либо в конструкторе контроллера в соответствии с нашими потребностями, как показано ниже.
В маршруте
Route::middleware('auth:admin')->group(function(){
//here all your admin routes
})
или конструктором контроллера
public function __construct()
{
$this->middleware('auth:admin');
}
Добрый день! Работаю над задачей где есть аутентификация пользователей, при этом нужна дополнительная для железа по апи. Не знаю как это реализовать