moko-github / kerberos-auth
Kerberos SSO authentication package for Laravel (REMOTE_USER, demande d'acces, mode simulation)
Requires
- php: ^8.2
- laravel/framework: ^12.0
- livewire/livewire: ^3.0|^4.0
Requires (Dev)
- larastan/larastan: ^3.0
- laravel/pint: ^1.18
- orchestra/testbench: ^10.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
This package is auto-updated.
Last update: 2026-06-03 13:38:28 UTC
README
Package Laravel d'authentification SSO Kerberos via la variable serveur REMOTE_USER.
Fonctionnalités
- Authentification automatique via
REMOTE_USER(Apache/Nginx Kerberos) - Gestion des demandes d'accès pour les comptes sans rôle
- Mode simulation pour les environnements de développement
- Composants Livewire inclus (access-denied, request-access, simulate-kerberos, simulation-banner)
- Migrations, seeders et commandes artisan inclus
Prérequis
Sur votre modèle utilisateur et votre application :
- Trait
Illuminate\Notifications\Notifiablesur le modèle User — requis pour l'envoi des notifications admin (nouvelle demande d'accès, tentative inconnue). - Table
notificationsmigrée (php artisan notifications:table && php artisan migrate) — la notification de nouvelle demande d'accès utilise le canaldatabase. - Colonne
remember_tokensur la tableusers(présente par défaut dans Laravel) sikerberos.remember_loginest àtrue(défaut). Sinon, passez-la àfalse. - Un worker de file d'attente (
php artisan queue:work) — les notifications implémententShouldQueueet sont poussées sur la filenotifications. - Routes nommées
dashboardetlogin(ou configurées viakerberos.redirects, voir Configuration).
Installation
1. Déclarer le dépôt dans composer.json
Production (dépôt VCS privé) :
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/moko-github/kerberos-auth"
}
]
}
Développement (chemin local) :
{
"repositories": [
{
"type": "path",
"url": "/chemin/vers/kerberos-auth",
"options": { "symlink": true }
}
]
}
2. Installer le package
# Production composer require moko-github/kerberos-auth # Développement (path local, pas encore de tag) composer require moko-github/kerberos-auth:@dev
3. Lancer l'installateur
php artisan kerberos:install
Sans option, la commande pose deux questions interactives. Sans réponse, les valeurs par défaut (entre crochets) s'appliquent.
◆ Installation de l'authentification Kerberos...
● Installer le système de rôles ? (table roles + colonne role_id sur users) (yes/no) [yes]
...migrations...
● Exécuter les seeders Kerberos ? (yes/no) [yes]
La question sur les rôles est posée avant les migrations, ce qui garantit que la colonne role_id n'est ajoutée à la table users que si vous en avez besoin.
Cette commande effectue automatiquement :
- Ajout des middlewares dans
bootstrap/app.php - Ajout du champ
kerberos(etrole_idsi rôles activés) dansapp/Models/User.php - Ajout des routes dans
routes/web.php - Configuration du scheduler dans
routes/console.php - Ajout des variables d'environnement dans
.env - Exécution des migrations et des seeders (selon les réponses)
Toutes les étapes sont idempotentes : relancer
kerberos:installne duplique rien. Si une injection automatique échoue, un message⚠indique les lignes à ajouter manuellement.
Options de la commande
| Option | Effet |
|---|---|
| (aucune) | Questions interactives |
--no-roles |
Ignore le système de rôles (migration roles + role_id + RolesSeeder) |
--no-seed |
Ignore tous les seeders sans poser de question (les migrations s'exécutent quand même) |
php artisan kerberos:install --no-roles # sans système de rôles php artisan kerberos:install --no-seed # migrations uniquement, sans seeders
Les flags ont la priorité sur les clés de config
install.run_seedersetinstall.seed_roles.
Seeders
RolesSeeder
Crée deux rôles en base : Admin et User.
Exécuté uniquement si vous avez répondu oui à la question sur le système de rôles (ou si --no-roles n'est pas passé). À ignorer si vous utilisez un autre système de rôles (Spatie Permission, rôles personnalisés, etc.).
KerberosSetupSeeder
Crée un compte administrateur de test (admin@example.com / password) avec l'identifiant Kerberos admin@krb.example.com, et assigne le rôle User aux utilisateurs existants sans rôle.
À utiliser pour initialiser la base lors d'une première installation. À ignorer (--no-seed) si vous gérez vos propres données initiales.
Note : si
App\Enums\UserStatusexiste dans l'application, le compte admin est créé avec le statutACTIVE.
Configuration
Publiez le fichier de configuration pour le personnaliser :
php artisan vendor:publish --tag=kerberos-config
Cela crée config/kerberos.php dans votre application.
Modèle utilisateur
Le package ne présume pas que votre modèle utilisateur est App\Models\User.
Il le résout automatiquement dans cet ordre :
config('kerberos.user_model')(override explicite)config('auth.providers.users.model')(défaut Laravel)App\Models\User(dernier recours)
Aucune configuration n'est nécessaire dans la majorité des cas. Pour forcer un modèle spécifique :
// config/kerberos.php 'user_model' => \App\Models\Account::class,
Routes de redirection
Le package redirige vers des routes nommées de votre application. Par défaut
dashboard (après login réussi) et login (accès refusé, fin de simulation, etc.).
Si vos routes portent d'autres noms :
// config/kerberos.php 'redirects' => [ 'success' => 'home', // après authentification réussie 'login' => 'auth.login', // route de connexion / fallback ],
ou via .env : KERBEROS_SUCCESS_ROUTE et KERBEROS_LOGIN_ROUTE.
Variables d'environnement
KERBEROS_ENABLED=false # Active l'authentification Kerberos KERBEROS_SERVER_VAR=REMOTE_USER # Variable serveur contenant le principal KERBEROS_FALLBACK_AUTH=true # true = login classique en secours ; false = Kerberos strict (403 sans ticket) KERBEROS_SIMULATION_MODE=false # Active le mode simulation (dév uniquement) KERBEROS_ADMIN_ROLE=Admin # Nom du rôle admin (destinataires des notifications) KERBEROS_ADMIN_EMAILS= # Emails admins (virgule). Si renseigné, notifie ces adresses ; sinon les users du rôle admin KERBEROS_ADMIN_NOTIFICATION_MODE=immediate # 'immediate' ou 'disabled' KERBEROS_AUTO_CLEANUP_DAYS=30 # Rétention des tentatives en jours KERBEROS_ALLOWED_DOMAINS= # (non implémenté — réservé multi-realm)
KERBEROS_FALLBACK_AUTH=falseimpose Kerberos : une requête sans ticket reçoit un403. Avectrue(défaut), l'utilisateur sans ticket atteint le formulaire de connexion classique de votre application.Notifications admin : avec
KERBEROS_ADMIN_EMAILSrenseigné, les emails sont envoyés directement à ces adresses (mail on-demand, même sans compte User). Sinon, les utilisateurs portant le rôleKERBEROS_ADMIN_ROLEsont notifiés. Si vous utilisez une stratégie de rôlerelation/callable, privilégiezKERBEROS_ADMIN_EMAILS.
Routes exclues
Par défaut, le middleware Kerberos exclut automatiquement ces routes :
access-denied, access-request.create, access-request.store, logout, livewire.*
Pour ajouter vos propres exclusions :
// config/kerberos.php 'excluded_routes' => [ 'admin.*', // toutes les routes d'admin 'api.*', // toutes les routes API 'webhook.pay', // une route spécifique ],
Layout des pages Kerberos
Les pages /demande-acces et /acces-refuse utilisent par défaut le layout minimal embarqué dans le package (kerberos-auth::layouts.guest) — une page blanche centrée qui ne nécessite que Tailwind CSS.
Pour utiliser le layout de votre application :
// config/kerberos.php 'layout' => 'layouts.auth', // layout Laravel standard 'layout' => 'components.layouts.app', // layout Livewire Volt 'layout' => 'layouts.guest', // votre propre layout guest
Pour personnaliser le layout du package :
php artisan vendor:publish --tag=kerberos-views
# → resources/views/vendor/kerberos-auth/layouts/guest.blade.php
Stratégie de vérification des rôles
Définit comment le package détermine qu'un utilisateur est autorisé à se connecter.
Un utilisateur qui échoue ce contrôle reçoit le statut NO_ROLE et est redirigé vers le formulaire de demande d'accès.
strategy: 'column' (défaut)
Vérifie une colonne du modèle User avec un opérateur.
'role_check' => [ 'strategy' => 'column', 'column' => 'role_id', // colonne à tester 'operator' => 'is_not_null', // 'is_not_null' (défaut) | 'is_null' ],
operator |
Condition d'accès | Cas d'usage typique |
|---|---|---|
is_not_null |
$user->role_id !== null |
Système mono-rôle (FK) |
is_null |
$user->deleted_at === null |
Soft-delete comme garde d'accès |
strategy: 'relation'
'role_check' => [ 'strategy' => 'relation', 'relation' => 'roles', ],
strategy: 'callable'
'role_check' => [ 'strategy' => 'callable', 'callable' => \App\Kerberos\MyAccessCheck::class, ],
La classe doit implémenter MokoGithub\KerberosAuth\Contracts\UserAccessCheckInterface :
class MyAccessCheck implements UserAccessCheckInterface { public function check(User $user): bool { return $user->deleted_at === null && $user->department !== 'EXTERN'; } }
Seeders (via config)
'install' => [ 'run_seeders' => false, 'seed_roles' => false, ],
Composants Livewire
<livewire:auth.access-denied />
Affiché quand un identifiant Kerberos est inconnu du système.
Route : GET /acces-refuse → access-denied
<livewire:auth.request-access />
Formulaire pour les utilisateurs reconnus mais sans rôle.
Route : GET /demande-acces → access-request.create
<livewire:auth.simulate-kerberos />
Interface de simulation réservée au développement. Prérequis : KERBEROS_SIMULATION_MODE=true.
<livewire:auth.simulate-kerberos />
<livewire:auth.simulation-banner />
Bannière visible quand une simulation est active. À placer dans le layout principal.
<livewire:auth.simulation-banner />
Personnalisation des vues
php artisan vendor:publish --tag=kerberos-views
Copie dans resources/views/vendor/kerberos-auth/ :
├── layouts/
│ └── guest.blade.php # layout par défaut des pages Kerberos
└── livewire/auth/
├── access-denied.blade.php
├── request-access.blade.php
├── simulate-kerberos.blade.php
└── simulation-banner.blade.php
Internationalisation (i18n)
Le package embarque des fichiers de traduction pour l'anglais (en) et le français (fr).
Par défaut, Laravel utilise la locale de config('app.locale').
Passer le package en français
Dans config/app.php :
'locale' => 'fr', 'fallback_locale' => 'en',
Toutes les chaînes du package (notifications mail, messages flash, validation, vues Blade) s'afficheront automatiquement en français.
Publier et personnaliser les traductions
php artisan vendor:publish --tag=kerberos-lang
Copie dans lang/vendor/kerberos-auth/ :
├── en/
│ └── kerberos.php
└── fr/
└── kerberos.php
Les fichiers publiés prennent le dessus sur ceux du package. Modifiez-les pour adapter les messages à votre contexte (ton, vocabulaire interne, langue tierce).
Note : Les traductions du package sont chargées sous le namespace
kerberos-auth. Les clés suivent la structurekerberos-auth::kerberos.<section>.<clé>, par exemplekerberos-auth::kerberos.flash.simulation_disabled.
Développement & tests
composer install composer test # tests Pest composer analyse # analyse statique PHPStan (niveau 5) composer format # formatage Laravel Pint composer format:test # vérifie le formatage sans modifier
Les tests s'appuient sur Orchestra Testbench + Pest, avec une base SQLite en
mémoire et un modèle utilisateur de fixture (tests/Fixtures/User.php).
La CI (.github/workflows/ci.yml) exécute Pint, PHPStan et Pest sur PHP 8.2 / 8.3 / 8.4.
Mise à jour
composer update moko-github/kerberos-auth php artisan migrate
Commandes artisan
php artisan kerberos:install # Installation initiale (interactif) php artisan kerberos:install --no-seed # Installation sans seeders php artisan kerberos:install --no-roles # Installation sans RolesSeeder php artisan kerberos:purge-attempts # Purge les tentatives anciennes
Publication des ressources
php artisan vendor:publish --tag=kerberos-config # config/kerberos.php php artisan vendor:publish --tag=kerberos-views # vues + layout guest php artisan vendor:publish --tag=kerberos-seeders # seeders php artisan vendor:publish --tag=kerberos-lang # traductions EN/FR