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_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,
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user