Skip to content

Commit 479ee3c

Browse files
committed
chore: refactoring authentication
1 parent 2bdf10a commit 479ee3c

File tree

6 files changed

+173
-6
lines changed

6 files changed

+173
-6
lines changed

Diff for: Cargo.lock

+111
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ name = "robust-rust"
1616
actix-web = "4"
1717
actix-web-flash-messages = { version = "0.3", features = ["cookies"] }
1818
actix-session = { version = "0.7", features = ["redis-rs-tls-session"] }
19+
actix-web-lab = "0.15"
1920
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
2021
serde = {version = "1.0.163", features = ["derive"]}
2122
serde-aux = "4.2.0"

Diff for: src/authentication/middleware.rs

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use crate::session_state::TypedSession;
2+
use actix_web::body::MessageBody;
3+
use actix_web::dev::{ServiceRequest, ServiceResponse};
4+
use actix_web::FromRequest;
5+
use actix_web::HttpMessage;
6+
use actix_web_lab::middleware::Next;
7+
use std::ops::Deref;
8+
use uuid::Uuid;
9+
10+
#[derive(Copy, Clone, Debug)]
11+
pub struct UserId(Uuid);
12+
impl std::fmt::Display for UserId {
13+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14+
self.0.fmt(f)
15+
}
16+
}
17+
impl Deref for UserId {
18+
type Target = Uuid;
19+
fn deref(&self) -> &Self::Target {
20+
&self.0
21+
}
22+
}
23+
24+
pub async fn reject_anonymous_users(
25+
mut req: ServiceRequest,
26+
next: Next<impl MessageBody>,
27+
) -> Result<ServiceResponse<impl MessageBody>, actix_web::Error> {
28+
let session = {
29+
let (http_request, payload) = req.parts_mut();
30+
TypedSession::from_request(http_request, payload).await
31+
}?;
32+
33+
match session.get_user_id().map_err(e500)? {
34+
Some(_) => next.call(req).await,
35+
None => {
36+
let response = see_other("/login");
37+
let e = anyhow::anyhow!("The user has not logged in");
38+
Err(InternalError::from_response(e, response).into())
39+
}
40+
}
41+
}

Diff for: src/authentication/mod.rs

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
mod middleware;
2+
mod password;
3+
pub use middleware::reject_anonymous_users;
4+
pub use middleware::UserId;
5+
pub use password::{change_password, validate_credentials, AuthError, Credentials};
File renamed without changes.

Diff for: src/routes/admin/password/post.rs

+15-6
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,37 @@ use crate::authentication::{validate_credentials, AuthError, Credentials};
22
use crate::routes::admin::dashboard::get_username;
33
use crate::session_state::TypedSession;
44
use crate::utils::{e500, see_other};
5+
use actix_web::error::InternalError;
56
use actix_web::{web, HttpResponse};
67
use actix_web_flash_messages::FlashMessage;
78
use secrecy::{ExposeSecret, Secret};
89
use sqlx::PgPool;
10+
use uuid::Uuid;
911

1012
#[derive(serde::Deserialize)]
1113
pub struct FormData {
1214
current_password: Secret<String>,
1315
new_password: Secret<String>,
1416
new_password_check: Secret<String>,
1517
}
18+
19+
async fn reject_anonymous_users(session: TypedSession) -> Result<Uuid, actix_web::Error> {
20+
match session.get_user_id().map_err(e500)? {
21+
Some(user_id) => Ok(user_id),
22+
None => {
23+
let response = see_other("/login");
24+
let e = anyhow::anyhow!("The user has not logged in");
25+
Err(InternalError::from_response(e, response).into())
26+
}
27+
}
28+
}
29+
1630
pub async fn change_password(
1731
form: web::Form<FormData>,
1832
session: TypedSession,
1933
pool: web::Data<PgPool>,
2034
) -> Result<HttpResponse, actix_web::Error> {
21-
let user_id = session.get_user_id().map_err(e500)?;
22-
if user_id.is_none() {
23-
return Ok(see_other("/login"));
24-
};
25-
26-
let user_id = user_id.unwrap();
35+
let user_id = reject_anonymous_users(session).await?;
2736

2837
if form.new_password.expose_secret() != form.new_password_check.expose_secret() {
2938
FlashMessage::error(

0 commit comments

Comments
 (0)