Add backend_state to AuthBackend

This commit is contained in:
2025-06-28 00:41:10 +00:00
parent b43f9fae8c
commit 36de234630
2 changed files with 20 additions and 8 deletions

View File

@ -64,7 +64,10 @@ async fn main() {
let session_store = RedisStore::new(state.get_redis_conn());
let session_layer = SessionManagerLayer::new(session_store);
let auth_backend = AuthBackend;
let auth_backend = AuthBackend {
backend_state: state.clone(),
};
let auth_layer = AuthManagerLayerBuilder::new(auth_backend, session_layer).build();
// A middleware that injects the backend state into the request extensions,

View File

@ -1,8 +1,9 @@
use crate::api::users::UserCredentials;
use axum_login::{AuthUser, AuthnBackend, UserId};
use leptos::server_fn::error::ServerFnErrorErr;
use crate::models::backend::User;
use crate::util::backend_state::BackendState;
use crate::util::error::*;
use async_trait::async_trait;
@ -19,26 +20,34 @@ impl AuthUser for User {
}
#[derive(Clone)]
pub struct AuthBackend;
pub struct AuthBackend {
/// The backend state is needed for the database connection
/// `extract`ing the backend state is not possible in this context
pub backend_state: BackendState,
}
#[async_trait]
impl AuthnBackend for AuthBackend {
type User = User;
type Credentials = UserCredentials;
type Error = ServerFnErrorErr;
type Error = BackendError;
async fn authenticate(
&self,
creds: Self::Credentials,
) -> Result<Option<Self::User>, Self::Error> {
crate::api::users::validate_user(creds)
let mut db_conn = self.backend_state.get_db_conn()?;
crate::api::users::validate_user(creds, &mut db_conn)
.await
.map_err(|e| ServerFnErrorErr::ServerError(format!("Error validating user: {e}")))
.context("Error validating user credentials")
}
async fn get_user(&self, user_id: &UserId<Self>) -> Result<Option<Self::User>, Self::Error> {
crate::api::users::find_user_by_id(*user_id)
let mut db_conn = self.backend_state.get_db_conn()?;
crate::api::users::find_user_by_id(*user_id, &mut db_conn)
.await
.map_err(|e| ServerFnErrorErr::ServerError(format!("Error getting user: {e}")))
.context("Error finding user by ID")
}
}