密码更改后自动设置注销

时间:2010-11-24 08:29:04

标签: ruby-on-rails

在Devise中,如果我更改了用户的密码,并且在数据库中更新后,该站点会立即注销该用户。我不想要这种行为 - 我该怎么做。请帮忙。

9 个答案:

答案 0 :(得分:127)

我遇到了同样的问题,以下代码似乎对我有用。

假设密码控制器设置为单一路由。此外,假设经过身份验证的模型是帐户。有了这个,你有以下几点:

def update
  if current_account.update_with_password(params[:account])
    sign_in(current_account, :bypass => true)
    flash[:notice] = 'Password updated.'
    redirect_to account_path
  else
    render :action => :show
  end
end

关键因素是sign_in方法调用,它试图重新登录帐户,但绕过监管者回调并将帐户存储到会话中。

答案 1 :(得分:11)

上面的例子对我在Devise中使用多个范围不起作用。

我必须在sign_in路径中添加范围/资源名称才能工作,为了防止混乱,我还必须签署旧用户,否则会出现各种混乱。

使用上面的示例,我必须做出的改变看起来像这样。

def update
   if current_account.update_with_password(params[:account])
     sign_out(current_account)
     sign_in(:account, current_account, :bypass => true)
     flash[:notice] = 'Password updated.'
     redirect_to account_path
   else
     render :action => :show
   end
end

编辑添加:我相信我必须强行签署用户,因为某处我覆盖了Devise的代码,以免在某些操作期间让用户退出。事后看来;不是个好主意!这种方法好多了!因为制作自己的控制器而不是覆盖Devise的代码更安全,除非它绝对是不可避免的。

答案 2 :(得分:11)

使用此代码以避免退出。

sign_in(current_user, :bypass => true)

答案 3 :(得分:5)

您只需在sign_in_after_reset_password

中设置devise.rb即可
config.sign_in_after_reset_password = true

答案 4 :(得分:3)

在更新数据库中的用户密码后立即将以下代码添加到更新用户密码的方法中:

def update
 . . . . .<your code>
 . . . . .<your code>

 sign_in(@user, :bypass => true)

 . . . . .<your code>
 . . . . .<your code>
end

答案 5 :(得分:2)

由于某些原因,current_user不等于@user,尽管current_user.id等于@user.id。所以我必须使用sign_in(@user, :bypass => true)

答案 6 :(得分:1)

上述Bill Eisenhauer的回复 -

sign_in(current_account, :bypass => true)已被弃用 使用bypass_sign_in current_account代替

更多细节可以在http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#bypass_sign_in-instance_method

找到

答案 7 :(得分:1)

请在这里参考此答案,我尝试了以上所有答案。不添加范围是行不通的。 https://stackoverflow.com/a/30418266/4973585

这不起作用- sign_in @user, bypass: true

这有效- sign_in :user, @user, bypass: true

答案 8 :(得分:0)

使用可注册模块,它将为您提供注册和编辑用户功能

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password