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_store = RedisStore::new(state.get_redis_conn());
let session_layer = SessionManagerLayer::new(session_store); 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(); let auth_layer = AuthManagerLayerBuilder::new(auth_backend, session_layer).build();
// A middleware that injects the backend state into the request extensions, // A middleware that injects the backend state into the request extensions,

View File

@ -1,8 +1,9 @@
use crate::api::users::UserCredentials; use crate::api::users::UserCredentials;
use axum_login::{AuthUser, AuthnBackend, UserId}; use axum_login::{AuthUser, AuthnBackend, UserId};
use leptos::server_fn::error::ServerFnErrorErr;
use crate::models::backend::User; use crate::models::backend::User;
use crate::util::backend_state::BackendState;
use crate::util::error::*;
use async_trait::async_trait; use async_trait::async_trait;
@ -19,26 +20,34 @@ impl AuthUser for User {
} }
#[derive(Clone)] #[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] #[async_trait]
impl AuthnBackend for AuthBackend { impl AuthnBackend for AuthBackend {
type User = User; type User = User;
type Credentials = UserCredentials; type Credentials = UserCredentials;
type Error = ServerFnErrorErr; type Error = BackendError;
async fn authenticate( async fn authenticate(
&self, &self,
creds: Self::Credentials, creds: Self::Credentials,
) -> Result<Option<Self::User>, Self::Error> { ) -> 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 .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> { 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 .await
.map_err(|e| ServerFnErrorErr::ServerError(format!("Error getting user: {e}"))) .context("Error finding user by ID")
} }
} }