密码更改后自动设置注销

问题描述 投票:73回答:8

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

ruby-on-rails
8个回答
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方法调用,它试图重新登录帐户,但绕过监管者回调并将帐户存储到会话中。


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的代码更安全,除非它绝对是不可避免的。


11
投票

使用此代码可以避免注销。

sign_in(current_user, :bypass => true)

5
投票

你可以简单地在你的sign_in_after_reset_password中设置devise.rb

config.sign_in_after_reset_password = true

3
投票

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

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

 sign_in(@user, :bypass => true)

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

2
投票

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


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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.