Authentification+Roles
Créer une application qui permet de gérer les utilisteurs (register,login,activer,désactiver,supprimer) selon les roles
Models
Permet de sécuriser l'accés au resources de l'application:
Models/Role
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User;
class Role extends Model
{ use HasFactory;
protected $primaryKey="idRole";
protected $table="roles";
protected $fillable=['name'];
public function users()
{
return $this->hasMany(User::class,'idRole');
}
}
Models/User
<?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;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
protected $fillable = [
'name',
'prenom',
'idRole',
'active',
'email',
'password',
];
public function role()
{
return $this->belongsTo(Role::class,'idRole','idRole');
}
protected $hidden = [
'password',
'remember_token',
];
protected $casts = [
'email_verified_at' =< 'datetime',
'password' => 'hashed',
];
}
Role :Migration
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('roles', function (Blueprint $table) {
$table->id('idRole');
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('roles');
}
};
User :Migration
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('prenom');
$table->foreignId('idRole');
$table->foreign("idRole")->references("idRole")->on("roles");
$table->integer('active')->default(0);
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('users');
}
};
Lancer la migration
php artisan migrate
php artisan ui bootstrap --auth
npm install
npm run build
Web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\RegisterController;
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get("/registerCompte",[RegisterController::class,'showRegister'])->name("showregister");
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
App\Http\Controllers\Auth\RegisterController
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Models\Role;
class RegisterController extends Controller
{
use RegistersUsers;
public function showRegister()
{
$listeRoles=Role::all();
return view("auth.register",compact("listeRoles"));
}
protected $redirectTo = '/home';
public function __construct()
{
$this->middleware('guest');
}
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'prenom' => ['required', 'string', 'max:255'],
'idRole' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'prenom' => $data['prenom'],
'idRole' => $data['idRole'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
}
views/auth/register.blade.php
...
....
<div class="row mb-3">
<label for="name" class="col-md-4 col-form-label text-md-end">{{ __('Name') }}</label>
<div class="col-md-6">
<input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<label for="prenom" class="col-md-4 col-form-label text-md-end">{{ __('prenom') }}</label>
<div class="col-md-6">
<input id="prenom" type="text" class="form-control @error('prenom') is-invalid @enderror" name="prenom" value="{{ old('prenom') }}" required autocomplete="prenom" autofocus>
@error('prenom')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<label for="idRole" class="col-md-4 col-form-label text-md-end">{{ __('Role') }}</label>
<div class="col-md-6">
<select id="idRole" class="form-control @error('idRole') is-invalid @enderror" name="idRole" value="{{ old('idRole') }}" required autocomplete="idRole" autofocus>
@foreach($listeRoles as $r) <option value="{{$r->idRole}}">{{$r->name}}</option>
@endforeach
</select>
@error('idRole')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
....
....
php artisan serve
Lancer la page register.php
http://127.0.0.1:8000/registerCompte
Lancer la page login.php
http://127.0.0.1:8000/login
layouts/app.blade.php
Modifier le navbar afin d'afficher les informations sur l'utilisateur connecté
...
....
....
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ms-auto">
<!-- Authentication Links -->
@guest
@if (Route::has('login'))
<li class="nav-item">
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
</li>
@endif
@if (Route::has('register'))
<li class="nav-item">
<a class="nav-link" href="{{ route('showregister') }}">{{ __('Register') }}</a>
</li>
@endif
@else
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
{{ Auth::user()->name }} <span style="color:red;"> {{ Auth::user()->role->name }}</span>
@if(Auth::user()->active==0)
<span style="color:yellow;background:#000;">Not Active</span>
@endif
@if(Auth::user()->active==1)
<span style="color:#fff;background:green;"> Active</span>
@endif
</a>
.....
....
....
Example d'utilisation:Gestion de Role
Créer le controller UserController afin de tester les role de chaque utilisateur
UserController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
class UserController extends Controller
{
public function showlistUers()
{
$userConnected=Auth::user();
if(Auth::check() && ($userConnected->active==1) && (($userConnected->role->name=="Admin") || ($userConnected->role->name=="SuperAdmin")))
{
$listeUsers=User::all();
return view("admin.listeUsers",compact("listeUsers"));
}
else {
return redirect("/home");
}
}
}
Web
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\RegisterController;
use App\Http\Controllers\UserController;
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get("/registerCompte",[RegisterController::class,'showRegister'])->name("showregister");
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get("/admin/users",[UserController::class,"showlistUers"])->name("admin.showlistUers");
Utilisatrion des middleware
Créer un middelware de gestion des role
php artisan make:middleware GestionRole
GestionRole
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Auth;
class GestionRole
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next,$role1,$role2): Response
{
$userConnectedRole=Auth::user()->role->name;
//laisser passe
if($userConnectedRole==$role1 || $userConnectedRole==$role2 )
{
return $next($request);
}
//sinon il n'as pas le droit
return Response("Vous n'avez pas le droit");
}
}
Ajouter le middleware GestionRole dans Kernel.php
protected $middlewareAliases = [
'gestionRole'=> \App\Http\Middleware\GestionRole::class,
....
Ajouter la route dans web.php
...
Route::get("/admin/users2",[UserController::class,"showlistUers"])->middleware("auth")->middleware("gestionRole:Admin,SuperAdmin");
....