1
resposta

Padrão DTO

Boa noite, eu estava lendo o material de apoio sobre DTO, que fala sobre o ataque Mass Assignment Attack e que o DTO é uma vantagem sobre este ataque, ai surguiu uma dúvida, seguindo o exemplo apresentado: Class controller:


@PostMapping
@Transactional
public void cadastrar(@RequestBody @Valid Usuario usuario) {
    repository.save(usuario);
}

Entitidade de persistência:

@Getter @Setter @NoArgsConstructor @EqualsAndHashCode(of = "id") @Entity(name = "Usuario") @Table(name = "usuarios") public class Usuario {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private String email;
private Boolean admin = false;

//restante do código omitido…

}

caso eu crie um DTO que não tenha a classe admin, evitando assim que ela seja modificada por uma requisição qualquer, como eu poderia alterar o status de admin futuramente? Seria chamando algum método só para alterar este status ou teria uma outra abordagem?

1 resposta

Ótima pergunta! Quando usamos DTOs para proteger nossas entidades de ataques de injeção de dependência maliciosa (como o Mass Assignment Attack), é importante lembrar que o DTO é uma cópia da entidade com os campos que queremos expor, e por isso podemos usá-lo para receber dados da requisição e enviar para o serviço ou repositório que fará a persistência dos dados. No seu exemplo, o campo "admin" não seria exposto no DTO, mas ainda precisamos de uma maneira de alterar esses dados posteriormente. Para isso, podemos criar um método específico na entidade (no seu caso, na classe Usuario) para realizar a atualização do campo "admin" diretamente no banco de dados. Por exemplo, você poderia adicionar o seguinte método na classe Usuario: @Transactional public void setAdmin(Boolean admin) { this.admin = admin; repository.save(this); } Dessa forma, sempre que for necessário atualizar o campo "admin", você poderá chamar esse método na entidade diretamente, sem precisar passar por um DTO. E o fato de que o campo "admin" não é exposto no DTO realmente protegerá a entidade contra alterações maliciosas. Espero que isso ajude.

Grande abraço Jackson