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?

Foi útil?

Solução

Então você tem 2 coisas:

  1. Na página de índice do controlador de carros, apenas os carros que pertencem ao usuário atual devem ser mostrados.
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top