限制数据可见性的方法

时间:2009-12-19 21:08:25

标签: ruby-on-rails authentication authorization authlogic denormalization

好的,假设有这个db模式(关系):

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

用户表由Authlogic生成。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

所以你有两件事:

  1. 在汽车控制器的索引页面中,只显示属于当前用户的汽车。
  2. 您希望将显示页面限制为所有者。
  3. 至于索引,我建议像:

    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列添加到costumers表中,这称为非规范化,但它在性能方面是可接受的。