pagetop/extensions/pagetop-user/src/middleware.rs

50 lines
1.8 KiB
Rust

//! Middleware Tower para la resolución de sesión de usuario.
//!
//! Se registra globalmente en [`crate::User::configure_middleware`] y se ejecuta en todas las
//! peticiones entrantes antes de que lleguen al handler. Inserta [`pagetop::auth::CurrentUser`] y,
//! si el usuario está autenticado, el [`crate::account::Account`] con sus datos ricos en las
//! extensiones de la petición HTTP.
use pagetop::prelude::*;
use crate::account::Account;
use crate::session;
/// Resuelve la sesión del usuario e inyecta los tipos de identidad en las extensiones de la
/// petición HTTP.
///
/// - Siempre inserta [`pagetop::auth::CurrentUser`] (anónimo o autenticado).
/// - Si hay sesión activa, inserta también el [`Account`] con roles y permisos.
pub(crate) async fn session_middleware(
mut req: web::Request,
next: web::middleware::Next,
) -> Response {
let (current_user, maybe_account) = session::resolve_session(req.headers()).await;
req.extensions_mut().insert(current_user);
if let Some(account) = maybe_account {
req.extensions_mut().insert(account);
}
next.run(req).await
}
// **< check_rbac_permission >**********************************************************************
/// Handler de la acción [`pagetop::auth::CheckPermission`] para el modelo RBAC de `pagetop-user`.
///
/// Lee el [`Account`] inyectado por el middleware de sesión desde las extensiones de la petición
/// HTTP y concede el permiso si el account lo tiene (un administrador lo tiene concedido siempre,
/// ver [`Account::has_permission`]).
pub(crate) fn check_rbac_permission(
request: &pagetop::web::HttpRequest,
perm: PermissionRef,
granted: &mut bool,
) {
let Some(account) = request.extension::<Account>() else {
return;
};
if account.has_permission(perm) {
*granted = true;
}
}