Rails中的当前用户

时间:2016-03-29 18:12:02

标签: ruby-on-rails security timezone

我有一个问题我在Rails中真的很新,我不确定什么是正确的。

  def current_user
   return unless params[:user_id]
   @current_user ||= User.find(params[:user_id])
 end

所以我得到了当前的用户。 Rails检查params的user_id。

但如果我喜欢这条路线/users/:id怎么办? 然后params是id而不是user_id这就是为什么它有时无法正确设置时区。 如何处理这样的事情?

 def set_time_zone(&block)
    if params[:user]
      Time.use_zone(params[:user][:time_zone], &block)
    else
      time_zone = current_user.try(:time_zone) || 'UTC'
      Time.use_zone(time_zone, &block)
    end
end

2 个答案:

答案 0 :(得分:1)

您可以覆盖current_user内的UsersController,以便查看id参数而不是user_id。或者你可以使用现有的方法,如下所示:

@current_user ||= User.find_by_id(params[:user_id]) || User.find_by_id(params[:id])

我要提醒你,不要认为params[:id]是理所当然的。如果我的用户ID为5,则无法阻止我访问/users/6

答案 1 :(得分:1)

在迄今为止我见过的所有rails应用程序current_user代表当前登录的用户。 当前登录用户的ID绝不能通过params发送,而是通过session发送(因为params可以被所有人操纵)。

  1. 用户通过表单提交用户名/密码
  2. controller验证用户名/密码匹配,如果正确
  3. 将用户ID设置为会话
  4. 然后你可以

    def current_user
      @current_user ||= begin
        User.find(session[:user_id]) if session[:user_id]
      end
    end
    

    在您的应用程序控制器中。