Authentification

Middlewares de protection & CurrentUser

login_required — protéger une route

Redirige vers REDIRECT_ANONYMOUS si l'utilisateur n'est pas connecté.

use runique::middleware::auth::login_required;

let protected = Router::new()
    .route("/dashboard", get(dashboard))
    .layer(axum::middleware::from_fn(login_required));

`redirect_if_authenticated` — page login/register

Redirige vers USER_CONNECTED_URL si l'utilisateur est déjà connecté. Utile pour éviter qu'un utilisateur connecté accède à /login.

use runique::middleware::auth::redirect_if_authenticated;

let public = Router::new()
    .route("/login", get(login_page).post(login_post))
    .layer(axum::middleware::from_fn(redirect_if_authenticated));

`load_user_middleware` — charger le contexte utilisateur

Injecte un CurrentUser dans les extensions de la requête. Permet d'accéder aux informations de l'utilisateur dans vos handlers.

use runique::middleware::auth::load_user_middleware;

let app = Router::new()
    .route("/profile", get(profile))
    .layer(axum::middleware::from_fn(load_user_middleware));

Accès dans un handler :

use runique::middleware::auth::CurrentUser;
use runique::context::RequestExtensions;

async fn profile(req: RuniqueRequest) -> impl IntoResponse {
    if let Some(user) = req.extensions().current_user() {
        println!("Connecté : {}", user.username);
    }
}

CurrentUser

Structure injectée par load_user_middleware dans les extensions de requête.

pub struct CurrentUser {
    pub id: i32,
    pub username: String,
    pub is_staff: bool,
    pub is_superuser: bool,
    pub roles: Vec<String>,
}

Méthodes disponibles

// Vérifier un rôle précis
user.has_role("editor")           // → bool

// Vérifier au moins un rôle parmi une liste
user.has_any_role(&["editor", "moderator"])  // → bool

// Accès à l'admin (is_staff || is_superuser)
user.can_access_admin()           // → bool

// Vérifier une permission admin (is_superuser bypass tout)
user.can_admin(&["editor"])       // → bool