嘿伙计们,我在应用程序控制器中使用过滤器安装程序在rails应用程序上有一个红宝石,以确保只有所有者才能编辑文档,但即使它不应该,我的权限检查也总是失败。这是代码:
def get_logged_in_user
id = session[:user_id]
unless id.nil?
@current_user = User.find(id)
end
end
def require_login
get_logged_in_user
if @current_user.nil?
session[:original_uri] = request.request_uri
flash[:notice] = "You must login first."
redirect_to login
end
end
def check_current_user_permission
require_login
logger.debug "user id is #{params[:user_id]}"
logger.debug "current user id is #{session[:user_id]}"
if session[:user_id] != params[:user_id]
flash[:notice] = "You don't have permission to do that."
redirect_to :controller => 'home'
end
end
要注意的代码在check_current_user_permission中。以下是我的日志输出示例:
user id is 3
current user id is 3
Redirected to http://localhost:3000/home
Filter chain halted as [:check_current_user_permission] rendered_or_redirected.
任何人都可以解释为什么会失败吗?显然,user_id为3等于会话的user_id为3.出了什么问题?
答案 0 :(得分:2)
如果session[:user_id]
为'3'并且params[:user_id]
为'3'并且它们不相等,那么您应该首先.to_i它们?
我只说这个,因为我有这个问题,我有两个DateTime对象,当你.to_s它们相等但由于某种原因不能评估为相等,因为不知何故它们只是一秒的不同。< / p>
Ruby是一种非常棒的语言,但其中一个缺点是弱类型的功能..它是一把双刃剑,因为弱类型的功能允许一些很酷的东西。
很高兴有帮助!