Mettre en place une authentification basique HTTP fixe sur Laravel

L'authentification des utilisateurs est un point plutôt bien traité par Laravel, à tel point que celui-ci est livré avec un modèle User basique, ainsi que tout ce qu'il faut pour mettre rapidement en place un process d'authentification basé sur les utilisateurs enregistrés par son biais.

Mais qu'en est-il si vous devez gérer vos utilisateurs d'une part, et avez simplement besoin de protéger d'autre part une page d'administration, à laquelle vous serez seul(e) à avoir accès, derrière un couple d'identifiants prédéfinis ? On pourrait bien sûr envisager d'ajouter une notion de rôle à la base d'utilisateurs existants, de façon à tout articuler autour du même système, mais je ne suis personnellement pas très à l'aise avec cette idée : bien qu'il s'agisse d'authentification dans les deux cas, celle-ci n'a pas du tout le même sens vis-à-vis de votre application.

Heureusement, nous allons tout de même pouvoir nous appuyer en partie sur ce que propose Laravel en termes d'authentification basique HTTP. La meilleure manière de procéder sera, sans aucun doute, de définir un filtre dans le fichier app/filters.php :

Route::filter(
'auth.admin',
function ($route, $request) {
$user = $request->getUser();
$password = $request->getPassword();

if (($user != Config::get('auth.admin.user')) || ($password != Config::get('auth.admin.password'))) {
// La méthode qui nous intéresse n'est pas publique, on va tricher
// Une manière plus propre de procéder serait d'étendre la classe concernée
$method = new ReflectionMethod('Illuminate\Auth\Guard', 'getBasicResponse');
$method->setAccessible(true);

$response = $method->invoke(new Illuminate\Auth\Guard());
return $response;
}
}
);

Vous remarquerez que j'ai choisi de stocker les identifiants attendus dans la configuration de l'application offerte par le framework. Pour ce faire, il suffit d'éditer le fichier app/config/auth.php comme suit (en bonus, vous pourrez facilement faire varier ces identifiants selon l'environnement d'exécution) :

return array(
// ...

'admin' => array(
'user' => 'mylogin',
'password' => 'mypassword'
)
);

Enfin, il ne nous reste plus qu'à attacher le filtre en question à une route :

Route::get(
'/admin',
array(
'before' => 'auth.admin',
function () {
// L'administrateur est authentifié
}
)
);

Ou directement dans un contrôleur :

class AdminController extends BaseController
{
public function __construct()
{
$this->beforeFilter('auth.admin');
}
}