Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Separação por empresa

Imagine a seguinte situação: Eu tenho uma api rest desenvolvida conforme o curso, com spring. Essa api tem o model Produto:

public class Produto {
    private Long id;
    private String descricao;
}

Na api é possível apenas para usuários autenticados fazer o get, post, put, e delete.

só que essa api vai ser usada por duas ou mais empresas diferentes que não tem vinculo nenhum entre si. e uma não poderá acessar os produtos cadastrados pelas outras e vice e versa.

A minha duvida é: O spring tem alguma ferramenta para lidar essa situação ou eu teria que programar manualmente colocando o atributo empresa no produto, e quando o usuário for fazer o get por exemplo eu pegaria a empresa que esse usuário pertence e faria um findByEmpresa no ProdutoRepository ao inves de um findAll.

EDIT: Eu pesquisei muito na internet e achei isso: https://www.baeldung.com/hibernate-5-multitenancy, mas não entendi como aplicar no projeto do curso e nem como ele trabalha tipo ele teria que identificar o usuário a quem pertence o token e fazer a consultas ao banco de dados certo, alguém pode me explicar?

5 respostas

Olá Leonardo, dê uma lida nesse artigo se te ajuda https://medium.com/swlh/multi-tenancy-implementation-using-spring-boot-hibernate-6a8e3ecb251a, mas você foi no caminho correto mesmo, essas são as duas opções.

1 - Você fazer o controle disso filtrando os dados.

2 - Você desenvolver sua aplicação multitenancy (basicamente você teria uma base centralizada contendo todos os usuários, poderia ser um micro serviço só pra fazer isso ou utilizar algo pronto, uma alternativa opensource seria o https://www.keycloak.org/), e os dados ficam em schemas separados do banco, a partir do usuário retornado você identificaria em qual schema do banco a aplicação deveria realizar as operações

Repositório exemplo: https://github.com/sumanentc/multitenant

É eu continuei pesquisando sobre multitenancy no spring, mas ainda não consigo implementar.

Esqueci de colocar o link rsrs

https://medium.com/swlh/multi-tenancy-implementation-using-spring-boot-hibernate-6a8e3ecb251a

(editei a resposta acima)

Então, continuando com essa novela aqui peguei o projeto e adicionei essas classes aqui:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TenantInterceptor());
    }
}



public class TenantInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String serverName = request.getServerName();
        String tenantId = serverName.substring(0, serverName.indexOf("."));

        request.setAttribute("tenant", tenantId);

        return true;
    }
}

Só que agora eu obtive 2 novas duvidas:

O que essas classes fazem?

A classe WebConfig implementa a interface WebMvcConfigurer, só que essa interface é para o padrão mvc e não para APIs Rest, qual é a interface que devo usar para apisRest?

Essa classe está adicionando um interceptor na sua aplicação, sempre que chegar uma requisição, antes de executar o código do seu controller irá passar pelo preHandle adicionando o atributo tenant a sua request com o valor tenantId

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software