0

好的,假设有这个数据库模式(关系):

|User    | (1-->n) |Customer | (1-->n) |Car  | (1-->n) |Support    |
|--------|         |---------|         |-----|         |-----------|
|id      |         | user_id |         |Brand|         |Description|
|username|         |lastname |         |PS   |         |Cost       |
|password|         |firstname|         |seats|         |hours      |
|...     |         |..       |         |...  |         |...        |

表 User 由 Authlogic 生成。

我有 2 个注册用户,每个人都有他的客户,等等。。使用 Authlogic,我可以只允许经过身份验证的用户访问控制器/视图。没关系,这就是 Authlogic 的用途。

现在我需要确保用户#1 永远不会获得属于用户#2 的客户的信息。

换句话说:如果用户#1 访问http://myapp.com/cars,他将看到属于用户#1 的客户的汽车列表

如果 id=131 的汽车属于用户#1 的客户,则只有用户#1 必须能够访问此信息 ( http://myapp.com/car/1 )。如果用户#2 在浏览器中插入相同的链接,他不必能够看到此信息。

有人建议我在用户和每个数据库表之间创建一个关系,以检查一条记录是否与 current_user 相关联。

你怎么看?最好的方法/解决方案是什么?

4

1 回答 1

1

所以你有两件事:

  1. 在汽车控制器的索引页面中,仅应显示属于当前用户的汽车。
  2. 您想将显示页面限制为所有者。

至于索引,我建议如下:

def index
  # find logic
  @cars = Car.find(:all,:conditions=>{:customer_id => current_user.customers.collect(&:id)})
  # whatever else
  # ...
end

和显示页面:

def show
  # .....
  # after the find logic
  redirect_to :index unless current_user.customers.collect(&:id).include? @car.customer_id 
  # whatever else
  # ...
end

这种方法在大多数情况下都可以,但是更好的性能方法是将 user_id 列添加到客户表中,这称为非规范化,但在性能方面它是可以接受的。

于 2009-12-19T21:46:30.320 回答