Documentation / Sessions / Protection des sessions
Protection des sessions
Protection automatique — `user_id`
Toute session contenant la clé user_id est considérée comme authentifiée et ne sera jamais supprimée sous pression mémoire (uniquement expirée normalement).
Cette clé est insérée automatiquement par le système d'authentification de Runique à la connexion.
Protection manuelle — `session_active`
Pour protéger une session anonyme à valeur (panier, formulaire multi-étapes, wizard), utilisez protect_session :
use runique::prelude::*;
// Protège la session pendant 30 minutes
protect_session(&session, 60 * 30).await?;
La clé session_active stocke un timestamp Unix futur. La protection expire automatiquement à cette date — aucune clé à nettoyer manuellement.
Pour retirer la protection explicitement :
unprotect_session(&session).await?;
Logique de protection
is_protected(record) = true si :
- record contient "user_id"
- OU record contient "session_active" avec un timestamp futur
Cas d'usage — protection d'un panier
use runique::prelude::*;
pub async fn add_to_cart(request: Request) -> AppResult<Response> {
// L'article vient de l'URL : /cart/add?item=42
let mut cart: Vec<String> = request.session.get("cart").await?.unwrap_or_default();
if let Some(item) = request.get_query("item") {
cart.push(item.to_string());
}
request.session.insert("cart", &cart).await?;
// Protéger la session 2h contre le cleanup d'urgence
protect_session(&request.session, 60 * 60 * 2).await?;
Ok(Redirect::to("/cart").into_response())
}
pub async fn checkout_complete(request: Request) -> AppResult<Response> {
// Vider le panier et retirer la protection
request.session.remove::<Vec<String>>("cart").await?;
unprotect_session(&request.session).await?;
Ok(Redirect::to("/confirmation").into_response())
}