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