Abordagem para limitar a visibilidade dos dados
-
20-09-2019 - |
Pergunta
Ok, suponha que tenha este esquema de banco de dados (relação):
|User | (1-->n) |Customer | (1-->n) |Car | (1-->n) |Support |
|--------| |---------| |-----| |-----------|
|id | | user_id | |Brand| |Description|
|username| |lastname | |PS | |Cost |
|password| |firstname| |seats| |hours |
|... | |.. | |... | |... |
O usuário da tabela é gerado pelo Authlogic.
Eu tenho 2 usuários registrados, cada um tem seus clientes, etc. Com o Authlogic, sou capaz de permitir que apenas usuários autenticados atinjam controladores/visualizações. Tudo bem, é para isso que é feito o Authlogic.
Agora preciso ter certeza de que o usuário nº 1 nunca alcançará informações pertencentes aos clientes do usuário nº 2.
Em outras palavras: se o usuário nº 1 for para http://myapp.com/cars Ele verá a lista de carros pertencentes a clientes do usuário nº 1
Se o carro com o id = 131 pertencer ao cliente do usuário nº 1, apenas o usuário nº 1 deverá poder alcançar essas informações (http://myapp.com/car/1). Se o usuário nº 2 inserir no navegador, o mesmo link, ele não precisará ver essas informações.
Algumas pessoas me sugeriram para criar uma relação entre o usuário e cada tabela de banco de dados para verificar se um registro está associado ao current_user.
O que você acha? Qual é a melhor abordagem/solução?
Solução
Então você tem 2 coisas:
- Na página de índice do controlador de carros, apenas os carros que pertencem ao usuário atual devem ser mostrados.
- Você deseja restringir as páginas para o proprietário.
Quanto ao índice, sugiro algo como:
def index
# find logic
@cars = Car.find(:all,:conditions=>{:customer_id => current_user.customers.collect(&:id)})
# whatever else
# ...
end
E a página do show:
def show
# .....
# after the find logic
redirect_to :index unless current_user.customers.collect(&:id).include? @car.customer_id
# whatever else
# ...
end
Essa abordagem é boa para a maioria dos casos, no entanto, uma abordagem melhor para o desempenho é adicionar uma coluna User_id à tabela de fantasia, isso é chamado de desnormalização, mas é aceitável para o desempenho.