Authentification
River fournit un service Auth complet pour gérer connexion, déconnexion, vérification et contrôle d'accès par rôle.
Service Auth
Le service River\Auth est enregistré par Auth_provider. Il est automatiquement partagé avec les templates ($auth).
use River\Auth;
class My_ctrl extends Controller {
public function __construct(
private Auth $auth,
// ...
){}
public function dashboard() {
$user = $this->auth->user(); // Utilisateur courant (object ou null)
$id = $this->auth->id(); // ID de l'utilisateur
}
}
Connexion
// Tentative avec email/password
if ($this->auth->attempt($email, $password)) {
return $this->auth->redirect_intended('/dashboard');
}
// Connexion manuelle (après vérification externe)
$this->auth->login($user);
Déconnexion
$this->auth->logout();
Vérification
$this->auth->check(); // true si connecté
$this->auth->guest(); // true si non connecté
$this->auth->user(); // object|null
$this->auth->id(); // int|null
Inscription
$id = $this->auth->register($email, $password, [
'name' => 'John',
'role' => 'user'
]);
Middleware d'authentification
Auth_middleware
Protège les routes qui nécessitent un utilisateur connecté. Redirige vers /login si non connecté.
use River\Middleware\Auth_middleware;
$router->get('dashboard', 'Dashboard::index')
->middleware(Auth_middleware::class);
Guest_middleware
Protège les routes réservées aux visiteurs (login, register). Redirige vers / si déjà connecté.
use River\Middleware\Guest_middleware;
$router->get('login', 'Auth_ctrl::login_form')
->middleware(Guest_middleware::class);
Role_middleware
Protège les routes par rôle. Accepte un ou plusieurs rôles en paramètres (logique OR).
use River\Middleware\Role_middleware;
// Un seul rôle
$router->get('admin', 'Admin::index')
->middleware(Role_middleware::class . ':admin');
// Plusieurs rôles (admin OU sysadmin)
$router->get('admin', 'Admin::index')
->middleware(Role_middleware::class . ':admin,sysadmin');
Comportement :
- Non connecté : redirige vers
/loginet mémorise l'URL demandée. - Connecté sans le bon rôle : retourne
404(ne révèle pas l'existence de la route). - Connecté avec un rôle autorisé : la requête passe au controller.
Groupe avec Role_middleware
$router->group([
'prefix' => 'admin',
'middleware' => Role_middleware::class . ':admin,sysadmin'
], function($r) {
$r->get('users', 'Admin\Users_ctrl::index');
$r->get('settings', 'Admin\Settings_ctrl::index');
});
Rôles dans les vues
$auth est automatiquement partagé dans tous les templates via Auth_provider::boot().
// Dans un template ($auth via extract(), pas $this->auth)
<?php if ($auth->check()): ?>
Bonjour <?= $this->e($auth->user()->name) ?>
<?php endif ?>
<?php if ($auth->has_role('admin')): ?>
<a href="/admin">Administration</a>
<?php endif ?>
<?php if ($auth->is_admin()): ?>
<!-- Raccourci pour has_role('admin') -->
<?php endif ?>
Note : Dans les templates, les données partagées sont des variables directes ($auth), pas des propriétés de $this. Utilisez $this->e(), $this->url() uniquement pour les helpers de Template.
Intended URL
Quand un utilisateur non connecté est redirigé vers /login, l'URL d'origine est mémorisée en session. Après le login, redirigez-le vers cette URL :
// Dans le controller de login
if ($this->auth->attempt($email, $password)) {
return $this->auth->redirect_intended('/dashboard');
}
// redirect_intended() renvoie vers l'URL mémorisée, ou /dashboard par défaut