Сначала нам нужно загрузить новое приложение laravel, используя следующую команду.
composer create-project laravel/laravel laravel-multi-auth
Теперь перейдите в каталог проекта.
cd laravel-multi-auth
1-) Настройка подключения к базе данных
Установите соединение с базой данных, откройте файл .env и определите детали вашей базы данных, это обеспечит консенсус между laravel и базой данных.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
2-) Настройка миграции и модели
Затем добавьте столбец is_admin в таблицу пользователей, используя файл миграции. Итак, откройте файл миграции create_users_table.php, который находится в базе данных/миграции, и обновите следующее поле для администратора.
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->tinyInteger('type')->default(0); /* Users: 0=>User, 1=>Admin, 2=>Manager */ $table->rememberToken(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } };
Затем откройте app/User.php и обновите приведенное ниже имя поля is_admin здесь:
<?php namespace App\Models; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; use Illuminate\Database\Eloquent\Casts\Attribute; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; protected $fillable = [ 'name', 'email', 'password', 'type' ]; protected $hidden = [ 'password', 'remember_token', ]; protected $casts = [ 'email_verified_at' => 'datetime', ]; protected function type(): Attribute { return new Attribute( get: fn ($value) => ["user", "admin", "manager"][$value], ); } }
Теперь добавьте поле is_admin, после чего будет использоваться приведенная ниже команда для создания этого поля в базе данных.
php artisan migrate
Теперь создайте встроенную систему аутентификации. Используйте приведенную ниже команду для создания системы аутентификации по умолчанию в laravel. И измените встроенную систему аутентификации laravel на систему множественной аутентификации.
Эта команда создаст файлы маршрутов, контроллеров и представлений для аутентификации и регистрации входа в Laravel. Это означает предоставить базовую аутентификацию и регистрацию входа в систему laravel. Полная система. Давайте откроем командную строку и введем следующую команду.
3-) Затем установите пользовательский интерфейс laravel 9 в свой проект, используя следующую команду:
composer require laravel/ui
Теперь выполните приведенную ниже команду на терминале для создания блейд-файлов входа, регистрации, сброса пароля и сброса пароля:
php artisan ui bootstrap --auth
Затем выполните следующие команды:
npm install npm run dev
4-) Создать промежуточное ПО UserAccess
На этом этапе нам необходимо создать промежуточное ПО для доступа пользователей, которое будет ограничивать доступ пользователей к этой странице. так что давайте создадим и обновим код.
php artisan make:middleware UserAccess
приложение/Http/middleware/UserAccess.php
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class UserAccess { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse */ public function handle(Request $request, Closure $next, $userType) { if(auth()->user()->type == $userType){ return $next($request); } return response()->json(['You do not have permission to access for this page.']); /* return response()->view('errors.check-permission'); */ } }
приложение/Http/Kernel.php
.... protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'user-access' => \App\Http\Middleware\UserAccess::class, ]; ....
5-) Создать маршруты
Здесь мы добавим следующую группу маршрутов, где вы можете создавать новые маршруты для пользователей, администраторов и менеджеров. давайте обновим код:
маршруты/web.php
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\HomeController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Auth::routes(); /*------------------------------------------ -------------------------------------------- All Normal Users Routes List -------------------------------------------- --------------------------------------------*/ Route::middleware(['auth', 'user-access:user'])->group(function () { Route::get('/home', [HomeController::class, 'index'])->name('home'); }); /*------------------------------------------ -------------------------------------------- All Admin Routes List -------------------------------------------- --------------------------------------------*/ Route::middleware(['auth', 'user-access:admin'])->group(function () { Route::get('/admin/home', [HomeController::class, 'adminHome'])->name('admin.home'); }); /*------------------------------------------ -------------------------------------------- All Admin Routes List -------------------------------------------- --------------------------------------------*/ Route::middleware(['auth', 'user-access:manager'])->group(function () { Route::get('/manager/home', [HomeController::class, 'managerHome'])->name('manager.home'); });
6-) Обновить контроллер
Здесь нам нужно добавить метод adminHome() и managerHome для маршрута администратора в HomeController. поэтому давайте добавим, как показано ниже:
приложение/Http/Controllers/HomeController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HomeController extends Controller { public function __construct() { $this->middleware('auth'); } public function index() { return view('home'); } public function adminHome() { return view('adminHome'); } public function managerHome() { return view('managerHome'); }}
7-) Настроить вид блейда
Откройте предварительно определенный файл resources/views/home.blade.php и вставьте в него основной код.
@extends('layouts.app')
@section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Dashboard</div>
<div class="card-body"> @if(session('login-success')) <div class="alert alert-success" role="alert"> {{ session('login-success') }} </div> @endif @if (session('status')) <div class="alert alert-success" role="alert"> {{ session('status') }} </div> @endif
You are normal user. </div> </div> </div> </div> </div> @endsection
Создайте и откройте файл resources/views/admin-home.blade.php и добавьте код.
@extends('layouts.app')
@section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Dashboard</div>
<div class="card-body"> @if(session('login-success')) <div class="alert alert-success" role="alert"> {{ session('login-success') }} </div> @endif @if (session('status')) <div class="alert alert-success" role="alert"> {{ session('status') }} </div> @endif
You are admin. </div> </div> </div> </div> </div> @endsection
8-) Настроить контроллер входа в систему
На этом шаге мы настроим класс LoginController, определим метод
login()
и вставим следующий код. Он обрабатывает проверку на стороне сервера, перенаправляет на панель администратора, если вошедший в систему пользователь является администратором.
Включите следующий код в файл app/Http/Controllers/Auth/LoginController.php.
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request;
class LoginController extends Controller { /* |-------------------------------------------------------------------------- | Login Controller |-------------------------------------------------------------------------- | | This controller handles authenticating users for the application and | redirecting them to your home screen. The controller uses a trait | to conveniently provide its functionality to your applications. | */
use AuthenticatesUsers;
/** * Where to redirect users after login. * * @var string */ protected $redirectTo = RouteServiceProvider::HOME;
/** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest')->except('logout'); }
public function login(Request $request) { $request->validate([ 'email' => 'required|email', 'password' => 'required' ]);
$credentials = $request->only('email', 'password');
if(! auth()->attempt($credentials)){ return redirect()->route('login') ->with('error','Email-Address And Password Are Wrong.'); }
if (auth()->user()->is_admin == 1) { return redirect()->route('admin.home'); }
return redirect()->route('home'); } }
9-) Создайте фиктивные данные с помощью Seeder
Поэтому создайте userseeder с помощью следующей команды:
php artisan make:seeder UsersSeeder
Теперь откройте файл database/seeds/UsersSeeder.php и вставьте следующие данные.
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder; use Illuminate\Support\Facades\Hash; use App\Models\User;
class UsersSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $usersData = [ [ 'name' =>'Admin', 'email' =>'[email protected]', 'is_admin' => 1, 'password' => Hash::make('12345678') ], [ 'name' => 'User', 'email' => '[email protected]', 'is_admin' => 0, 'password' => Hash::make('12345678') ], ];
foreach ($usersData as $key => $val) { User::create($val); } } }
10-) Запустите приложение Laravel Multi Auth и протестируйте
Вызовите приложение laravel multi auth с помощью приведенной ниже команды.
php artisan serve
Откройте в браузере следующий URL: http://127.0.0.1:8000/login
Панель администратора:
Используйте следующие учетные данные для панели администратора:
Email: [email protected]
Password: 12345678
Вот это представление вы увидите после входа в систему с использованием роли администратора
Панель пользователя:
Используйте следующие учетные данные для панели администратора:
Email: [email protected]
Password: 12345678
Вот это представление вы увидите после входа в систему с использованием обычного входа пользователя
Надеюсь, вам понравилось пошаговое руководство по мультиаутентификации laravel. Так что не забудьте поделиться с другими, хорошего дня.