【问题标题】:rails devise sign_in doesn't work on redirectrails devise sign_in 不适用于重定向
【发布时间】:2012-06-08 11:15:21
【问题描述】:

我有这个方法:

  def update
    @user = User.find(params[:id])
    respond_to do |format|
      if @user.update_attributes(params[:user])
        if params[:mypmnode]
          session[:return_to] = projects_pmnode_path(params[:mypmnode])
          sign_in(@user)
        end
        format.html { redirect_to(session[:return_to], :notice => 'User was successfully updated.') }
        format.xml  { head :ok }
      else
        @create_company = true if params[:user][:company_id].blank? and  params[:user][:company_attributes].length > 0
        @create_department = true if params[:user][:department_id].blank? and  params[:user][:department_attributes].length > 0
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

这个想法是,如果用户更新,他会自动登录并重定向到需要身份验证的页面。

在这个页面中,我有: before_filter :authenticate_user!

这不适用于重定向。

如果我使用此登录功能转到另一个页面,则用户正确登录。

知道为什么重定向不起作用吗?谢谢!

更新:

为了更清楚,我插入第二页代码(控制器):

class PmnodesController < Projects::BaseController

  before_filter authenticate_user!

  def index
    @pmnodes = Pmnode.all
    respond_to do |format|
      format.html 
    end
  end

【问题讨论】:

  • 你的意思是用户应该在更新属性后重定向到登录(登录)页面?
  • 不,我正在尝试让他自动登录,然后将他重定向到私人页面,而无需手动登录。

标签: ruby-on-rails devise signing


【解决方案1】:

如果在@user 上更新密码,设计将使会话无效。在update_attributes之后,您可以尝试先调用sign_out

sign_out(@user)
sign_in(@user)

【讨论】:

  • 这也对我有用。作为管理员,我想以其他用户身份登录,但首先我必须注销。
【解决方案2】:

你确定你的节目进入了这个博客

if params[:mypmnode]
      session[:return_to] = projects_pmnode_path(params[:mypmnode])
      sign_in(@user)
end

如果不是,这应该会自动登录您的使用。

def update
    @user = User.find(params[:id])
    respond_to do |format|
  if @user.update_attributes(params[:user])
    if params[:mypmnode]
      session[:return_to] = projects_pmnode_path(params[:mypmnode])

    end
    sign_in(@user)

    format.html { redirect_to(session[:return_to], :notice => 'User was successfully updated.') }
    format.xml  { head :ok }
  else
    @create_company = true if params[:user][:company_id].blank? and  params[:user][:company_attributes].length > 0
    @create_department = true if params[:user][:department_id].blank? and  params[:user][:department_attributes].length > 0
    format.html { render :action => "edit" }
    format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
  end
end
end

【讨论】:

  • 是的,我很肯定!重定向到正确的页面。我认为 current_user 在更新记录后没有正确重新定义。我更新了密码,所以如果 authenticate_user!使用旧密码值,这可能是问题的原因。但是不知道怎么强制更新current_user
【解决方案3】:

我也遇到过类似的问题:

我有一个控制器方法可以创建并登录用户

def new
  @user = User.create!
  sign_in @user
  redirect_to some_nondefault_path
end

其中 some_nondefault_path 需要身份验证。 new 操作不需要身份验证。用户正在创建和登录,但用户会话没有持续,用户得到 401-unauthorized 并被重定向到登录页面而不是 some_nondefault_path。

我最终通过添加解决了它

skip_before_filter :verify_authenticity_token, :only => :new

到第一个控制器。它似乎试图在创建用户会话之前验证 CSRF 令牌,该会话失败并阻止了正常用户会话的创建(即使它没有尝试 authenticate_user!)。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    相关资源
    最近更新 更多