actix_web_security/authentication/scheme/basic/
authentication_provider.rs1use async_trait::async_trait;
4
5use crate::authentication::error::error_type::AuthenticationError;
6use crate::authentication::scheme::authentication::Authentication;
7use crate::authentication::scheme::authentication_provider::AuthenticationProvider;
8use crate::authentication::scheme::basic::user_details_service::BasicUserDetailsService;
9use crate::authentication::scheme::basic::BasicAuthentication;
10use crate::user_details::UserDetails;
11
12#[derive(Clone)]
14pub struct BasicAuthenticationProvider {
15 user_details_service: Box<dyn BasicUserDetailsService>,
16}
17
18impl BasicAuthenticationProvider {
19 pub fn new(
22 user_details_service: Box<dyn BasicUserDetailsService>,
23 ) -> BasicAuthenticationProvider {
24 BasicAuthenticationProvider {
25 user_details_service,
26 }
27 }
28}
29
30#[async_trait]
31impl AuthenticationProvider for BasicAuthenticationProvider {
32 #[allow(clippy::borrowed_box)]
33 async fn authenticate(
34 &self,
35 authentication: &Box<dyn Authentication>,
36 ) -> Result<Box<dyn UserDetails>, AuthenticationError> {
37 if authentication.is::<BasicAuthentication>() {
38 let basic_auth = authentication
39 .downcast_ref::<BasicAuthentication>()
40 .unwrap();
41 match self
42 .user_details_service
43 .find_user(&basic_auth.username, &basic_auth.password)
44 .await
45 {
46 Some(user) => Ok(user),
47 None => Err(AuthenticationError::UsernameNotFound),
48 }
49 } else {
50 Err(AuthenticationError::InvalidAuthentication)
51 }
52 }
53}