2010-05-30 103 views
0

嘿家伙我有一个应用程序控制器中的过滤器安装前的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. 

任何人都可以阐明为什么这是失败?很显然,3的user_id等于会话的user_id为3.发生了什么问题?

+0

只是好奇......你使用authlogic认证的东西? – DJTripleThreat 2010-05-30 02:16:08

+0

另外,如果session [:user_id]是'3'而params [:user_id]是'3'并且它们不相等,也许你应该先.to_s他们?我只是这样说,因为我有这个问题,我有两个DateTime对象,当你.to_s他们是平等的,但由于某种原因,不计算相等,因为不知何故,他们是第二个不同的一小部分。 – DJTripleThreat 2010-05-30 02:20:06

+0

我会尝试DJTripleThreat ...另外我没有使用任何宝石进行身份验证 – Jimmy 2010-05-30 02:24:57

回答

2

如果session[:user_id]是'3'而params[:user_id]是'3'并且他们不相等,也许你应该先把它们放到第一位?

我只说这是因为我有这个问题,我有两个DateTime对象,当你.to_s他们他们是平等的,但由于某种原因,不计算相等,因为不知何故,他们是第二个不同的一小部分。

Ruby是一种很棒的语言,但是一个缺点就是弱类型的特性..它是一把双刃剑,因为弱类型的特性允许一些很酷的东西。

很高兴帮助!

+0

我想说这将是更好的转换为一个整数,而不是一个字符串。 – alternative 2010-05-30 21:29:13

+0

@〜mthepic,我同意......我习惯使用强类型语言,因此转换为字符串通常更容易。 Ruby中不是这样。我将编辑我的帖子。 – DJTripleThreat 2010-05-31 17:00:38