Add backend_state to AuthBackend
This commit is contained in:
@ -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,
|
||||
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user