Exemple complet & AdminPanel
Exemple complet — Login / Logout
use runique::prelude::*;
// LoginForm — déclaré séparément, .no_hash() obligatoire sur le champ password
#[derive(Serialize, Debug, Clone)]
#[serde(transparent)]
pub struct LoginForm {
pub form: Forms,
}
impl RuniqueForm for LoginForm {
fn register_fields(form: &mut Forms) {
form.field(&TextField::text("username").label("Nom d'utilisateur").required());
form.field(&TextField::password("password").label("Mot de passe").no_hash().required());
}
impl_form_access!();
}
pub async fn login_post(mut request: Request) -> AppResult<Response> {
let form: LoginForm = request.form();
let validated = match ValidationForm::try_new(form, &request).await {
Ok(validated) => validated,
Err(form) => {
context_update!(request => { "login_form" => &form });
return request.render("login.html");
}
};
let db = request.engine.db.clone();
let username = validated.cleaned_string("username").unwrap_or_default();
let password = validated.cleaned_string("password").unwrap_or_default();
// 1. Vérifier les identifiants : mot de passe vérifié même pour un nom inconnu
// (pas de fuite par le temps de réponse), compte actif et activé.
// 2. Ouvrir la session — identifiant de session et jeton CSRF renouvelés.
if let Some(user) = authenticate_user(&db, username.trim(), &password).await
&& login(&request.session, &user, None, false).await.is_ok()
{
return Ok(Redirect::to("/dashboard").into_response());
}
// Identifiants invalides (message générique — ne pas distinguer user inconnu / mdp faux)
let form = validated.into_form();
context_update!(request => {
"login_form" => &form,
"messages" => flash_now!(error => "Identifiants invalides"),
});
request.render("login.html")
}
pub async fn logout_view(mut request: Request) -> AppResult<Response> {
logout(&request.session, None).await.ok();
Ok(Redirect::to("/login").into_response())
}
Authentification pour l'AdminPanel
Rien à configurer : l'admin connecte les comptes de eihwaz_users, actifs et staff ou
superuser. Pour ajouter des champs au modèle utilisateur, utiliser extend!{ table: "eihwaz_users", ... }.
Pour brancher l'authentification au panneau d'administration, voir aussi 11-Admin.md.