在Devise中,如果我更改了用户密码,并且在数据库中更新了该密码后,该站点将立即注销该用户。我不想这种行为-我该怎么做。请帮忙。
在Devise中,如果我更改了用户密码,并且在数据库中更新了该密码后,该站点将立即注销该用户。我不想这种行为-我该怎么做。请帮忙。
Answers:
我遇到了同样的问题,以下代码似乎对我有用。
假定为单例路由设置了密码控制器。另外,假定已认证的模型是帐户。这样,您将拥有以下内容:
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方法调用,该方法试图重新登录帐户,但绕过了Warden回调并将该帐户存储到会话中。
sign_out
之上添加sign_in
,首先在实例变量中捕获模型,以便您可以通过sign_in
方法传递模型,否则将传递nil
。
上面的示例对我在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的代码更安全。
sign_out current_user
但确实需要sign_in :user, @user, bypass: true
。
您可以简单地sign_in_after_reset_password
在devise.rb
config.sign_in_after_reset_password = true
更新以上的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
在数据库中更新用户密码之后,立即将以下代码段添加到用于更新用户密码的方法中:
def update
. . . . .<your code>
. . . . .<your code>
sign_in(@user, :bypass => true)
. . . . .<your code>
. . . . .<your code>
end
由于某些原因,尽管current_user
不等于,@user
但是current_user.id
不等于@user.id
。所以我不得不用sign_in(@user, :bypass => true)
。
user.reload
请在这里参考此答案,我尝试了以上所有答案。不添加范围是行不通的。 https://stackoverflow.com/a/30418266/4973585
这行不通-
sign_in @user, bypass: true
这有效-
sign_in :user, @user, bypass: true
使用可注册模块,这将使您可以注册和编辑用户功能
https://github.com/plataformatec/devise/wiki/操作方法:-Allow-users-to-edit-their-password