Skip to content

Commit 636ebab

Browse files
committed
beginning implementation of authorization
1 parent 4b52328 commit 636ebab

4 files changed

Lines changed: 33 additions & 8 deletions

File tree

src/authorization/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use mockall::*;
22
use serde::{Deserialize, Serialize};
33
use thiserror::Error;
4+
use uuid::Uuid;
45

56
#[derive(Error, Debug)]
67
pub enum AuthorizationError {
@@ -9,7 +10,7 @@ pub enum AuthorizationError {
910
}
1011

1112
pub struct User {
12-
pub user_id: String,
13+
pub user_id: Uuid,
1314
pub role: String,
1415
}
1516

src/handlers/authorization.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,42 @@
11
use anyhow::anyhow;
2-
use axum::{body::Body, extract::Request, extract::State, http::Response, middleware::Next};
2+
use axum::{
3+
body::Body,
4+
extract::{Request, State},
5+
http::Response,
6+
middleware::Next,
7+
Extension,
8+
};
9+
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
310

4-
use crate::{authorization::User, errors};
11+
use crate::{
12+
authentication::Claims,
13+
authorization::User as AuthzUser,
14+
errors,
15+
models::{self, user::Entity as User},
16+
};
517

618
use super::AppState;
719

8-
pub async fn is_user_action_allowed(
9-
State(AppState { authorization, .. }): State<AppState>,
20+
pub async fn can_list_users(
21+
State(state): State<AppState>,
22+
Extension(claims): Extension<Claims>,
1023
req: Request,
1124
next: Next,
1225
) -> Result<Response<Body>, errors::ServerError> {
26+
let conn = &*state.conn.clone();
27+
let authorization = state.authorization.clone();
28+
29+
let user = User::find()
30+
.filter(models::user::Column::Auth0Id.eq(claims.sub.to_owned()))
31+
.one(conn)
32+
.await
33+
.map_err(|err| errors::ServerError::Internal(anyhow!(err)))?
34+
.ok_or(errors::ServerError::Unauthorized)?;
35+
1336
let is_authorized = authorization
1437
.is_action_allowed(
15-
User {
16-
user_id: "random".to_owned(),
38+
AuthzUser {
39+
user_id: user.user_id.to_owned(),
1740
role: "random".to_owned(),
1841
},
1942
"list_users".to_owned(),

src/handlers/routes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub fn router(app_state: AppState) -> Router {
3232
"/users",
3333
get(users::list_users).layer(middleware::from_fn_with_state(
3434
app_state.clone(),
35-
authorization_middleware::is_user_action_allowed,
35+
authorization_middleware::can_list_users,
3636
)),
3737
)
3838
.route("/users/{user_id}", get(users::get_user))

src/handlers/users_test.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ mod tests {
9393
};
9494

9595
let conn = MockDatabase::new(DatabaseBackend::Postgres)
96+
.append_query_results(vec![vec![user_db_1.clone()]])
9697
.append_query_results(vec![vec![user_db_1.clone(), user_db_2.clone()]])
9798
.into_connection();
9899

0 commit comments

Comments
 (0)