1
resposta

[Sugestão] /course/java-spring-security-crie-perfis-autorize-requisicoes/task/171798

Na implantação sugerida pelo nistrutor, foi criado um método no repositório de Consultas, porém não foi dada a implantação.

Segue sugestão de implantação usando a anotação @Query para busca por id.

package med.voll.web_application.domain.consulta;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface ConsultaRepository extends JpaRepository<Consulta, Long> {

    Page<Consulta> findAllByOrderByData(Pageable paginacao);

    @Query("""
            SELECT c FROM Consulta c
            WHERE c.paciente.id = :id
            ORDER BY c.data
    """)
    Page<Consulta> buscarConsultas(Pageable paginacao, Long id);
}

O método listarna Service ficou

    public Page<DadosListagemConsulta> listar(Pageable paginacao, Usuario logado) {
        if(logado.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ATENDENTE")))
            return repository.findAllByOrderByData(paginacao).map(DadosListagemConsulta::new);
        return repository.buscarConsultas(paginacao, logado.getId()).map(DadosListagemConsulta::new);
    }
1 resposta

Olá Leonardo! Tudo joia?

Obrigado por compartilhar sua sugestão de implementação para o método no repositório de Consultas. A anotação @Query realmente é uma ferramenta poderosa para personalizar consultas no Spring Data JPA, e sua aplicação aqui parece bem adequada para buscar consultas por ID de paciente.

Para resolver o problema de segurança que você mencionou, onde pacientes ou médicos podem acessar ou modificar consultas que não lhes pertencem, você pode considerar o uso das anotações @PreAuthorize ou @PostAuthorize do Spring Security. Essas anotações permitem que você defina regras de acesso diretamente nos métodos do seu serviço.

Por exemplo, você pode usar @PreAuthorize para garantir que apenas o proprietário da consulta ou um usuário com a autoridade adequada possa acessar ou modificar uma consulta:

@PreAuthorize("#logado.getAuthorities().contains('ROLE_ATENDENTE') or #logado.id == #id")
public Page<DadosListagemConsulta> listar(Pageable paginacao, Usuario logado, Long id) {
    if(logado.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ATENDENTE")))
        return repository.findAllByOrderByData(paginacao).map(DadosListagemConsulta::new);
    return repository.buscarConsultas(paginacao, id).map(DadosListagemConsulta::new);
}

Neste exemplo, a anotação @PreAuthorize verifica se o usuário tem a autoridade de "ROLE_ATENDENTE" ou se o ID do usuário logado corresponde ao ID do paciente cujas consultas estão sendo acessadas.

Para operações de exclusão, você pode aplicar uma lógica semelhante:

@PreAuthorize("#logado.getAuthorities().contains('ROLE_ATENDENTE') or #logado.id == #consulta.paciente.id")
public void excluirConsulta(Long consultaId, Usuario logado) {
    // Lógica para excluir a consulta
}

Essas abordagens ajudam a restringir o acesso e garantir que apenas usuários autorizados possam ver ou modificar registros que lhes pertencem. Lembre-se de testar essas configurações em um ambiente seguro para garantir que todas as regras de acesso estejam funcionando conforme esperado.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.