2
respostas

Dúvida em relação ao acesso de dados relacionados ao Usuário.

Olá pessoal Boa noite. Agora no final do curso fiquei com uma dúvida, qual seria uma solução interessante para que o usuário logado acesse só os dados que ele criou, ou seja os dados que ele tem acesso. Por exemplo, vamos dizer que um médico atendeu vários pacientes, mas ele deveria ter acesso só aos pacientes dele e não dos outros médicos, e até mesmo poder alterar ou deletar só os seus pacientes.

Eu pensei que eu poderia em todas as tabelas adicionar o seguinte field:

created_by_owner - Aqui ficaria registrado a foreign key do user que criou o dado.

E sempre que eu for fazer alguma alteração ou mesmo deletar, eu checo se o usuário logado bate com o usuário que criou, enquanto, recuperar os dados (GET), faria um findByUsername.

Esse método é válido? qual vocês indicariam?

Abraços!

2 respostas

Legal mano, mas uma dica, nesse caso, você terá que tomar alguns cuidados, por exemplo

-O sistema que vai ter que identificar o médico apartir das credenciais dele, e o sistema forneceria o valor desse campo ao banco, não o usuário. Entao você deve ter uma tabela de usuário aí aonde você cadastra os médicos, e cada médico tem que ter uma chave única, tipo um ID , aí quando faz a consulta da tabela de pacientes, o sistema identifica que é o médico x, e esse médico x tem um ID único, e esse ID único é usado no select no banco para trazer todos os pecientes que estão atrelado esse ID. O que não pode é o médico pode fornecer esse ID pro sistema, que ao meu ver seria uma falha, pois o médico poderia burlar essa condição apenas colocando um ID de outro médico

Boa velho, essa era exatamente minha preocupação, pois se você envia o ID pelo body ou header da requisição pode fazer o que quiser, mas se você pegar o user logado depois da autenticação e autorização, da pra certificar se o registro é dele. Eu criei uma classe abstrata chamada DefaultColumns, segue o código:

import java.time.LocalDateTime;

import jakarta.persistence.Column;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.MappedSuperclass;
import jakarta.persistence.OneToMany;
import lombok.Getter;
import lombok.Setter;

@MappedSuperclass
@Setter
@Getter
public abstract class DefaultColumns {

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(referencedColumnName = "USER_ID")
    private User createdByUser;

    @Column(name = "creation_date")
    private LocalDateTime creationDate;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(referencedColumnName = "USER_ID")
    private User updatedByUser;

    @Column(name = "update_date")
    private LocalDateTime updateDate;

}

As classes que devem ter essa proteção herdam essa classe, e quando o usuário "logado" criar um novo item o mesmo é associado ao registro, depois recuperar esses registros e alterar os mesmo fica fácil.

Eu achei melhor fazer usando herança através do @MappedSuperClass, mas da pra fazer com composição usando o @Embeddable, ensinado no começo do curso.