From 4c8cd5cb619c155136566a9a63da60bf8ea18a57 Mon Sep 17 00:00:00 2001 From: Augusto Herrmann Date: Thu, 13 Feb 2025 12:19:21 -0300 Subject: [PATCH] Allow user to read their own user data --- src/api.py | 22 ++++++++++++++++------ tests/user_test.py | 17 +++++++++++++++-- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/api.py b/src/api.py index 92b5a76..a095aa5 100644 --- a/src/api.py +++ b/src/api.py @@ -282,22 +282,32 @@ async def create_or_update_user( async def get_user( user_logged: Annotated[ # pylint: disable=unused-argument schemas.UsersSchema, - Depends(crud_auth.get_current_admin_user), + Depends(crud_auth.get_current_active_user), ], email: str, db: DbContextManager = Depends(DbContextManager), ) -> schemas.UsersGetSchema: """Retorna os dados cadastrais do usuário da API especificado pelo - e-mail informado.""" + e-mail informado. + + O usuário com perfil comum só pode consultar os dados do seu próprio + usuário. O usuário com perfil admin pode consultar qualquer usuário. + """ + # verifica permissões + if not user_logged.is_admin and email != user_logged.email: + raise HTTPException( + status.HTTP_403_FORBIDDEN, + detail="Usuário não tem permissões de administrador.", + ) + # verifica se o usuário existe user = await crud_auth.get_user(db, email) if user: return user.model_dump(exclude=["password"]) - else: - raise HTTPException( - status.HTTP_404_NOT_FOUND, detail=f"Usuário `{email}` não existe" - ) + raise HTTPException( + status.HTTP_404_NOT_FOUND, detail=f"Usuário `{email}` não existe" + ) @app.post( diff --git a/tests/user_test.py b/tests/user_test.py index 9abb16f..9ac71da 100644 --- a/tests/user_test.py +++ b/tests/user_test.py @@ -274,16 +274,29 @@ def test_get_user_not_logged_in(self, header_not_logged_in: dict): assert response.status_code == status.HTTP_401_UNAUTHORIZED def test_get_user_logged_in_not_admin( + self, user1_credentials: dict, header_usr_2: dict # user is_admin=False + ): + """Testa a obtenção de dados de um outro usuário por um usuário logado, + mas não admin. + + Args: + user1_credentials (dict): Credenciais do usuário 1. + header_usr_2 (dict): Cabeçalhos HTTP para o usuário 2. + """ + response = self.get_user(user1_credentials["email"], header_usr_2) + assert response.status_code == status.HTTP_403_FORBIDDEN + + def test_get_user_self_logged_in_not_admin( self, user2_credentials: dict, header_usr_2: dict # user is_admin=False ): - """Testa a obtenção de um usuário por um usuário logado, mas não admin. + """Testa a obtenção de dados do próprio usuário logado, mas não admin. Args: user2_credentials (dict): Credenciais do usuário 2. header_usr_2 (dict): Cabeçalhos HTTP para o usuário 2. """ response = self.get_user(user2_credentials["email"], header_usr_2) - assert response.status_code == status.HTTP_403_FORBIDDEN + assert response.status_code == status.HTTP_200_OK def test_get_user_as_admin( self, user1_credentials: dict, header_usr_1: dict # user is_admin=True