代码之家  ›  专栏  ›  技术社区  ›  Art Shayderov

在Rails的用户模型中引用当前用户安全吗?

  •  1
  • Art Shayderov  · 技术社区  · 15 年前

    你知道,我想我必须检查模型回调中的当前用户(比如 before_update ).而不是仅仅依靠增加 where ('something.user_id = ?', 'current_user.id') 在控制器里。我需要像这样的东西 Thread.CurrentPrincipal 在里面网
    在用户模型中引用当前用户安全吗?很抱歉,我还不太明白它在引擎盖下是如何工作的。
    或者你是怎么做到的?
    抱歉,如果这是个愚蠢的问题。

    于3月27日添加
    哎呀
    为了得到正确的答案,你必须问正确的问题。而这本身并不是一项容易的任务。怎么可能其他人的问题如此模糊,他们得到了他们的答案,而你自己的问题如此明确,但没有人理解呢?:)
    我不知道该把安全检查放在哪里。用户只能访问自己的东西。在控制器层面?然后测试每一个动作?“不应该/查看|创建|编辑|销毁/其他用户的东西”?我想也许我可以把它放在模型中,然后有一个地方来/写|重构|测试/。这就是为什么我问如何获得当前用户的引用。
    事实上,我很惊讶在Rails指南或博客中没有找到任何相关内容。有人问了一些问题,但除了“不要这样做”之外,没有权威的“最佳实践”。
    经过思考,我决定只在控制器中创建,然后再过滤当前用户的作用域,只依赖于我自己的约定(向自己承诺,我不会直接访问模型)。每个控制器只需测试一次。这不是银行应用程序。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Eimantas    15 年前

    我不确定我是否了解你的情况。如果您想检查其他模型的实例是否属于当前的用户-使用关联(我从“something.user_id=?”推断)。

    Else-在ActiveRecord中 before_update 方法是基于每个实例使用的。例如,将当前实例作为参数传递给该回调。因此:

    def before_update(current_user_instance)
      current_user_instance.do_something
    end
    

    将产生任何用户实例作为 current_user_instance 在回拨中。所以你可以做以下几点:

    >> user_1 = User.find(1)
    >> user_1.update_attribute(:some_attribute, 'some value')
    >> user_2 = User.find(2)
    >> user_2.update_attribute(:some_attribute, 'some other value')
    

    这会叫 do_something 方法在单独的实例上使用( user_1 user_2 )

        2
  •  0
  •   Swanand    15 年前

    我真的不明白 Thread.CurrentPrincipal 但是 current_user 通常指登录用户,这完全是控制器上下文。它不可用于模型内部。因此,黑客解决方案是:

    class UseCase < ActiveRecord::Base
      after_save :my_callback_method
    
      attr_accessor :current_user
    
      def my_callback_method
        # Some operations based on current_user
      end
    
      # ...
    end
    

    然后在控制器中:

    #...
    use_case = UseCase.find(use_case_id) # Just an example, can be anything
    use_case.current_user = current_user
    # then this
    use_case.save
    # or basically
    use_case.method_that_triggers_after_save_callback
    #...
    

    警告:我相信这是真的 令人不快的 练习(我自己从来没用过)。但这会奏效的。Ruby大师/MVC大师,请发表评论。