Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Como isolar os dados de uma aplicação com spring security ?

Acabo de habilitar autenticação e autorização através do Spring Security, e desejo fazer com que os dados salvos a partir de um usuário não sejam acessados por outros usuários. Estou tendo acesso ao usuário logado através da tag

<security:authentication property="principal"/>

e autorizações com a

 <security:authorize access="isAuthenticated()">.

Como disse, gostaria que cada usuário ao acessar tivesse uma "espécie" de base de dados separada, mas que fosse possível definir que o usuário "A" possa compartilhar, visualizar, editar dados com um usuário "B" também.

Da forma como a minha aplicação está no momento, uma vez que o usuário está autenticado, se o mesmo pedir para listar objetos em uma view qualquer, o resultado será o retorno de todos os objetos daquele tipo do banco de dados, pois os mesmos não foram salvos levando em consideração quem os criou e salvou no banco de dados os mesmos.

O gerenciamento da autorização existe e tem funcionado através da Spring Security's Tag Library normalmente,

<security:authorize access="isAuthenticated()">

e

 <security:authorize access="hasAuthority()">

Mas veja que agora eu estou falando somente do usuário poder ou não realizar uma ação, e sim de uma forma de vincular o usuário logado aos seus dados, e também haver uma maneira de um usuário conceder permissão para que outro usuário altere os seus dados.

Existe uma forma inteligente de fazer isso utilizando a autenticação e autorização do spring security ? Ou eu terei que fazer isso passando parâmetros via controladores que nem eu já fiz uma vez para salvar imóveis relativos a um condomínio por exemplo, e também de trazer em uma consulta somente imóveis relativos a esse condomínio da mesma forma.

Por curiosidade, a aplicação de que falo está publicada em https://smartrentmanager.herokuapp.com/ se isso ajudar em alguma coisa...

Está (na data deste post) com um permitAll() lá no / ....

2 respostas
solução!

Opa, boa noite :). São 2 coisas diferentes. A primeira de separar bases, passar o id do dono como argumento etc é relativa ao multi tenant. Infelizmente não existe uma solução pronta e aí tem que fazer que nem você fez... Os approaches são os mais variados, uma base só com id do dono em todas as tabelas. Bases separadas, schemas separados na mesma base.

O segundo é o ownership, e o spring security vem com um módulo para isso.. não é muito fácil, mas viável de aprender. Na documentação => http://docs.spring.io/spring-security/site/docs/4.2.3.RELEASE/reference/htmlsingle/ , acessa o tópico 27. Domain Object Security (ACLs). Tenta dar uma estudada e implementar.. vai exigir umas boas horas.

Alberto Souza boa tarde e muito obrigado pela sua resposta. Eu vou iniciar atacando a questão do multi tenant então para não complicar as coisas neste momento. E após isso eu vou tentar dar uma lida no módulo que você mencionou e atacar a questão de conseguir realizar uma gestão compartilhada de alguns dados da aplicação.

Dentre os sites que eu pesquisei, achei esse interessante relativo a questão do multi tenant.

https://www.brentozar.com/archive/2011/06/how-design-multiclient-databases/

Novamente, obrigado.