设计更改密码后自动注销


76

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


3
“此功能正是针对此类情况而添加的,管理员在编辑某人的密码时,可以确保该人将被注销。在某些设备被盗的情况下非常有用,并且在网站上更改密码可以确保窃取您设备的人将无法访问该指定的网站。” bit.ly/1qkO7jx
Zajo 2014年

rails> 5的bypass_sign_in(@user)
vidur punj

Answers:


130

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

假定为单例路由设置了密码控制器。另外,假定已认证的模型是帐户。这样,您将拥有以下内容:

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回调并将该帐户存储到会话中。


感谢您的验证。我的猜测是,作者目前已经转移到其他问题上。很高兴为您工作。我仍然欠他们的维基页面帮助别人。
Bill Eisenhauer

1
谢谢,它也对我有用,尽管我不确定为什么Devise首先将用户注销。
Alex Korban 2011年

6
给所有未来读者的注释,如果这行不通,并且您需要首先在sign_out之上添加sign_in,首先在实例变量中捕获模型,以便您可以通过sign_in方法传递模型,否则将传递nil
Simpleton 2012年

1
如果current_user.update_with_password(bleh)返回,false那么您可能像我一样在参数中缺少current_password。检查
nicooga 2014年

1
@Questifer:此答案假定实现将密码视为单例资源。因此,更新操作的范围严格来说是密码本身。尽管它从未被弄清楚,而且距离我提出答案已有好几年了,但您可以想象该请求正在发布旧密码,新密码和确认密码。希望这可以帮助。
Bill Eisenhauer 2014年

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的代码更安全。


最后!找到了!这工作了!原来我不需要sign_out current_user但确实需要sign_in :user, @user, bypass: true
克洛伊(Chloe)2015年

11

使用此代码可避免注销。

sign_in(current_user, :bypass => true)

10

您可以简单地sign_in_after_reset_passworddevise.rb

config.sign_in_after_reset_password = true

很棒的解决方案,您知道他们为什么默认禁用此功能吗?似乎应该相反。
瑞克斯

1
与此类框架中的大多数内容一样,我怀疑向后兼容。
codebreach

1
自2020年起,该默认设置为true,因此用户在更改密码后会自动登录。
萨米·伯恩鲍姆


4

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

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)


这令人费解。我提出了一个与此有关的问题,但由于未收到任何答案而被删除。供参考 stackoverflow.com/q/39490056/936494是我的问题的链接。
Jignesh Gohel

也许您需要重新加载用户对象?尝试致电user.reload
ricks


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.