Authentification

Middlewares de protection & CurrentUser

Protection de routes — pattern recommandé

login_required et redirect_if_authenticated ont été supprimés. La protection s'écrit directement dans le handler, ce qui est plus explicite et laisse le contrôle de l'URL au dev.

use runique::prelude::*;

// Protéger une route
async fn dashboard(mut request: Request) -> AppResult<Response> {
    if !is_authenticated(&request.session).await {
        return Ok(Redirect::to("/login").into_response());
    }
    // ...
}

// Rediriger si déjà connecté (page login/register)
async fn login_page(mut request: Request) -> AppResult<Response> {
    if is_authenticated(&request.session).await {
        return Ok(Redirect::to("/").into_response());
    }
    // ...
}

`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::prelude::*;

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

Accès dans un handler :

use runique::prelude::*;

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: Pk,      // i32 par défaut, i64 avec la feature "big-pk"
    pub username: String,
    pub is_staff: bool,
    pub is_superuser: bool,
    pub groupes: Vec<Groupe>,
}

Méthodes disponibles

// Permissions effectives (toutes ressources, OR logique sur tous les groupes)
user.permissions_effectives()                 // → Vec<Permission>

// Permission pour une ressource précise
user.permission_for("users")                  // → Option<Permission>

// Accès en lecture à une ressource (is_superuser bypass tout)
user.can_access_resource("users")             // → bool

// Accès au panneau admin (is_staff || is_superuser)
user.can_access_admin()                       // → bool