Множественная авторизация в laravel

В этой статье мы шаг за шагом рассмотрим как на laravel сделать множественную авторизацию.

План работы

Мы сделаем систему аутентификации для 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');
}

Рейтинг
( 1 оценка, среднее 5 из 5 )
Maxyc Webber/ автор статьи
Мне 35 лет. Опыт профессиональной разработки 15 лет. Занимаюсь разработкой и поддержкой корпоративных систем автоматизации бизнеса, а также высоконагруженными проектами. Мне нравится решать нестандартные проблемы бизнеса. Имею опыт формирования команд под проект, налаживания процесса разработки, коммуникации программистов и заказчиков. Есть опыт работы с зарубежными заказчиками (ОАЭ, Польша, Германия, Швейцария).
Понравилась статья? Поделиться с друзьями:
Комментарии: 1
  1. Roman

    Добрый день! Работаю над задачей где есть аутентификация пользователей, при этом нужна дополнительная для железа по апи. Не знаю как это реализовать

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.