Spring Boot — Bunny (Multi Tenancy)

Marcelo de Souza Vieira
Alcatéia Dev
Published in
3 min readSep 15, 2020

spring-boot-bunny

Este é um componente multitenant para ser usado em aplicações spring-boot. Com este componente, pode ser configurado múltiplas fontes de dados para manter os dados em diferentes esquemas. Que está usando o Hibernate suporte multi-tenancy trabalhando com a estratégia de banco de dados separado.

Configuração

1) Baixar o projeto no git https://github.com/betao22ster/bunny, dar o install do maven.

2) No seu projeto, adicionar a dependencia:

<dependency>
<groupId>com.msv</groupId>
<artifactId>bunny</artifactId>
<version>0.0.4-SNAPSHOT</version>
</dependency>

3) No seu projeto, criar uma entity que implementa a interface DataSourceConfig. EX:

@Entity
@Table(name="NOME_TABLE")
public class DataSourceTable implements DataSourceConfig, Serializable { private static final long serialVersionUID = -5018185835788890513L; @Id @GeneratedValue
private Long id;
private String name;
private String url;
private String username;
private String password;
private String driverClassName;
private boolean initialize; public Long getId() {
return id;
} public String getName() {
return name;
} public String getUrl() {
return url;
} public String getUsername() {
return username;
} public String getPassword() {
return password;
} public String getDriverClassName() {
return driverClassName;
} public boolean getInitialize() {
return initialize;
}
}

4) No seu projeto, criar uma respository que implementa a interface DataSourceConfigRepository.

@Repository
public interface DataSourceTableRepository extends DataSourceConfigRepository<DataSourceTable>, JpaRepository<DataSourceTable, Long> {}

=========

Quer fazer vários cursos de microservice? Entre no site www.alcateiadev.com.br e lá tem cupons de desconto semanal.

=========

Configuração do Spring Security

Porque integrar com o Spring Security?
Quando o sistema é integrado ao Spring Security, após o login, os dados do usuário ficam registrados.
É possível obter os dados do login como está abaixo ou injetando.

SecurityContextHolder.getContext().getAuthentication().getPrincipal();

Desta forma, podemos ter neste objeto, os dados que o bunny precisa.
Na classe TenantIdentifierResolver do bunny ele identifica se o já existe um usuário logado, e já retorna o identificador do tenancy.
Para nos isso é importante.
Caso esteja em um projeto de micro-service, os demais serviços, iram já funcionar corretamente, identificando o tenancy pelo usuário logado.

Vamos configurar o spring security: 1) Deve ser usado no maven a seguinte dependencia.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

2) Crie uma classe que vai servir para manter nosso dados de login.

public class UserDetailsModify extends User implements DataSourceConfigSecurity {    private static final long serialVersionUID = 3375988537129735478L;
private DataSourceTable dataSourceTable; public UserDetailsModify(String login, String senha, List<GrantedAuthority> auth, DataSourceTable dataSourceTable) {
super(login, senha, auth);
this.dataSourceTable = dataSourceTable;
} @Override
public DataSourceConfig getDataSourceConfig() {
return dataSourceTable;
}}

O importante nesta classe, para o bunny, é a implementação da classe DataSourceConfigSecurity.

3) Crie um service básico, para consultar os dados do login.

@Service
public class Users implements UserDetailsService { @Autowired
private UserRepository repo; @Autowired
private DataSourceTableRepository repository; @Override
public OpsUserDetails loadUserByUsername(String email) throws UsernameNotFoundException { // sua entidade da tabela de usuário normal
Usuario user = repo.findByEmail(email); if (user == null) {
return null;
} List<GrantedAuthority> auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER"); DataSourceTable dataSourceTable = repository.findOne(user.getId()); return new UserDetailsModify(user.getEmail(), user.getSenha(), auth, dataSourceTable);
}}

4) Pronto, basta criar agora o bean para configurar o spring security.

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired
private Users users; @Autowired
public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
// @formatter:off auth.userDetailsService(users); }
}

Executando

Na sua classe principal, adicionar a anotação @LoadDataSourceConfig adicionando as duas classes criadas e a anotação @ComponentScan com o pacote do bunny.

@LoadDataSourceConfig(config=DataSourceTable.class, configRepository=DataSourceTableRepository.class)
@ComponentScan(basePackages={"com.msv.bunny.multitenant"})

GIT

https://github.com/marcelosv/bunny

--

--

Marcelo de Souza Vieira
Alcatéia Dev

CTO at Sellers. I work since 2004 with Java and a passion for the profession. I am enthusiastic about Open Source projects.