我有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
答案 0 :(得分:0)
我在这里看不到任何安全问题。即使没有before_action :signed_in_user
,由于您总是通过current_user.common_app
关联,如果用户未登录,则操作将失败。
所以控制器很健全。只要您的身份验证系统没有缺陷,控制器本身就不会暴露任何弱点。
在Ruby中,前缀为“@”的变量是实例变量。在Rails控制器的上下文中,区别很简单:
将实例变量用于您希望视图可用的值,以及其他所有值的常规变量。