这是必要的行动之前的correct_user吗?

时间:2013-12-15 11:12:46

标签: ruby-on-rails

我有2个模型,用户和common_app。

用户has_one common_app。

在common_app控制器中,我使用current_user帮助器定义几乎所有内容。这基本上使得编辑表单忽略了用户通过Web浏览器POST的id。

看起来像是这样 - >

class CommonAppsController < ApplicationController
  before_action :signed_in_user

  def new
    if current_user.common_app.present?
      redirect_to current_user
    else
      @common_app = current_user.build_common_app
    end
  end

  def create 
    @common_app = current_user.build_common_app(common_app_params)
    if @common_app.save
        flash[:success] = "Common App Created!"
        redirect_to root_url
    else
        redirect_to 'common_apps/new'
    end
  end

  def update
    if current_user.common_app.update_attributes(common_app_params)
      flash[:success] = "Common App Updated"
      redirect_to root_url
    else
      render 'common_apps/edit'
    end
  end

  def show
    @common_app = current_user.common_app
  end

  def edit
    @common_app = current_user.common_app
  end

  private

    def common_app_params
      params.require(:common_app).permit(:current_city,:grad_year,:read_type,
                                          :listen_speak,:time_in_china,
                                          :cover_letter,:resume) ####fill in the correct ones here
    end

    # is correct_user necessary?
end

让我警惕的是,在行动之前我没有使用correct_user。如果我不使用它,这里会有安全漏洞吗?我可以通过shell或其他东西POST吗?

如果是,您将如何更改控制器,以包含之前的过滤器?

PS:我对@变量的正确使用感到有些困惑。如果我过度使用它们,或者对它们做些古怪的事情,请告诉我并帮助我成为一个更好的菜鸟:)

PPS:这是我的SessionsHelper模块,用于在过滤器工作之前使用signed_in_user - &gt;

module SessionsHelper
  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end
  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    remember_token = User.encrypt(cookies[:remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
  end

  def current_user?(user)
    user == current_user
  end

  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end

  def redirect_back_or(default) # this creates friendly forwarding for the app
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)
  end

  def store_location
    session[:return_to] = request.url if request.get?
  end

  def signed_in_user
    unless signed_in?
      store_location
      redirect_to signin_url, notice: "Please sign in."
    end
  end


end

1 个答案:

答案 0 :(得分:0)

我在这里看不到任何安全问题。即使没有before_action :signed_in_user,由于您总是通过current_user.common_app关联,如果用户未登录,则操作将失败。

所以控制器很健全。只要您的身份验证系统没有缺陷,控制器本身就不会暴露任何弱点。

在Ruby中,前缀为“@”的变量是实例变量。在Rails控制器的上下文中,区别很简单:

将实例变量用于您希望视图可用的值,以及其他所有值的常规变量。