Správa používateľov a ich rolí je jednou zo základných funkcií, ktoré potrebuje takmer každá webová aplikácia. V tomto článku sa pozrieme na to, ako implementovať robustný systém správy používateľov a rolí pomocou frameworku Laravel. Zameriame sa na vytváranie používateľov, prideľovanie rolí a implementáciu autorizácie na základe týchto rolí.
Nastavenie autentifikácie
Laravel poskytuje jednoduché riešenie pre autentifikáciu pomocou balíka laravel/ui
. Nainštalujeme ho a spustíme generovanie potrebných súborov:
composer require laravel/ui
php artisan ui vue --auth
npm install && npm run dev
php artisan migrate
Týmto sme nastavili základnú autentifikáciu s registráciou a prihlasovaním.
Vytvorenie modelov a migrácií pre roly
Vytvorenie modelu Role
Najprv vytvoríme model Role
a zodpovedajúcu migráciu:
php artisan make:model Role -m
Otvoríme súbor migrácie v database/migrations
a pridáme stĺpec pre názov role:
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->timestamps();
});
}
Pridanie role_id do používateľov
Potrebujeme pridať stĺpec role_id
do tabuľky users
. Vytvoríme novú migráciu:
php artisan make:migration add_role_id_to_users_table --table=users
V migrácii pridáme stĺpec:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->unsignedBigInteger('role_id')->nullable()->after('id');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('set null');
});
}
a spustíme migrácie kódikom php artisan migrate
Definovanie vzťahov medzi modelmi
Model User
V modeli User
definujeme vzťah k modelu Role
:
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
public function role()
{
return $this->belongsTo(Role::class);
}
}
Model Role
V modeli Role
definujeme vzťah k modelu User
:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
public function users()
{
return $this->hasMany(User::class);
}
}
Seeder pre roly
Vytvoríme seeder, ktorý nám naplní tabuľku roles
základnými rolami:
php artisan make:seeder RolesTableSeeder
V seederi database/seeders/RolesTableSeeder.php
pridáme:
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Role;
class RolesTableSeeder extends Seeder
{
public function run()
{
Role::create(['name' => 'admin']);
Role::create(['name' => 'user']);
}
}
Následne spustíme seeder cez php artisan db:seed –class=RolesTableSeeder
Prideľovanie rolí používateľom
V kontroleri RegisterController
môžeme nastaviť predvolenú rolu pre nových používateľov:
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Models\User;
use App\Models\Role;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller
{
use RegistersUsers;
protected function create(array $data)
{
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
// Pridanie role používateľovi
$user->role()->associate(Role::where('name', 'user')->first());
$user->save();
return $user;
}
}
Následne môžeme pridať middleware pre kontrolu rolí, aleboďalšie rozšírenia podľa požiadaviek na robustnosť správy rolí.
Celá debata | RSS tejto debaty