Caros colegas, Boa noite!
Estou desenvolvendo uma aplicação web utilizando JSF, Hibernate, Spring 3 e Tomcat 7 e de uma hora para outra foi decidido que a aplicação terá que operar em um ambiente SAAS.
Dessa forma, estou com algumas dúvidas conceituais sobre a maneira de implementar essa solução.
Banco de dados:
Para cada cliente será criado uma database, tendo em vista a segurança dos dados de cada cliente.
Isso será feito acessando dinamicamente os bancos de dados, encontrei um material bastante interessante no link http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/
Autenticação:
Estou com uma grande dúvida sobre a forma que os usuários irão autenticar no sistema sendo que nesse ambiente terei várias bases de dados com diversos usuários cadastrados em cada base.
De que forma fazer isso, pois a database que o usuário vai acessar só saberei depois que o mesmo estiver autenticado.
Criar uma outra database para tratar da autenticação dos usuários, com base nos cadastros que tem nas demais databases?
Nesse link http://www.ibm.com/developerworks/br/library/ar-saassec/ tem um bom material explicando a forma conceitual disso.
Gostaria da ajuda de vocês para esclarecer essas dúvidas.
Grato
Boa noite,
Não sei se é a forma mais adequada, porém resolvi isso da seguinte maneira:
Inicialmente configurei os datasources no spring onde vou obter a database a ser utilizada em tempo de execução.
Depois, configurei uma base padrão para o spring e criei uma view que recupera o login e a senha das tabelas de usuários das demais databases.
Cara, com relação à segurança dos dados, não precisas necessariamente ter diversas bases. Podes fazer isso usando um discriminator, o próprio Hibernate já te dá essa facilidade aí de lambuja.
O que tu queres, na realidade, é a implementação de multi-tenancy. Tá uma olhada nas opções que tens.
Havia um projeto, o Hibernate Shards, que lhe oferecia isso; agora ele já faz parte do core do Hibernate. Tens 3 opções:
- várias bases de dados;
- uma base de dados, usando discriminator ids pras entidades;
- várias bases, mas que trabalham de forma paralela.
Eu fiz usando a primeira; várias bases, vários shards configurados como datasources; e uma base a mais, que só guarda informações de login, e ela possui os discriminators para os shards. Assim, ele loga usando a primeira base de dados, e em seguida direciona a sessão do usuário para o shard correspondente ao mesmo.
A documentação é extremamente pobre, infelizmente. Qualquer dúvida, vai gritando aqui.
Abraço!
Bom dia,
Realmente poderia utilizar o discriminator, porém , pensando lá na frente, se o cliente querer ter acesso a aos dados por uma ferramenta de BI, seria meio complicado.
Por isso eu optei pela opção de criar uma bases de dados para cada cliente.
Vou dar uma pesquisada por Hibernate Shards, nunca utilizei o mesmo.
De qualquer forma, valeu pelas dicas.
Uma outra dúvida que tenho em relação à esse ambiente, é de que maneira fazer customizações por clientes.
Deveria ter uma aplicação para cada cliente? Rodar várias aplicações no tomcat?
A arquitetura multi-tenant serve justamente pra teres uma única aplicação rodando pra todos eles; pra fazer customizações, a meu ver, só usando versões diferentes pra cada cliente. Ou então fazer uma gambiarra bem maluca de modular o teu sistema, e cada cliente usar os respectivos módulos.