Ruby on rails 强制用户在首次使用Desive登录时重置密码
[最后使用我当前的解决方案更新了ETA] 我希望能够为高价值用户手动创建帐户,这意味着我们必须为他们生成密码,并让他们在第一次登录时更改密码。我找到了一个解决办法,但它似乎是围绕着设计而不是使用它 我目前的工作是覆盖Deviate ConfirmationController中方法的#after_confirmation _path",以便它包含以下代码段:Ruby on rails 强制用户在首次使用Desive登录时重置密码,ruby-on-rails,ruby-on-rails-4,devise,Ruby On Rails,Ruby On Rails 4,Devise,[最后使用我当前的解决方案更新了ETA] 我希望能够为高价值用户手动创建帐户,这意味着我们必须为他们生成密码,并让他们在第一次登录时更改密码。我找到了一个解决办法,但它似乎是围绕着设计而不是使用它 我目前的工作是覆盖Deviate ConfirmationController中方法的#after_confirmation _path",以便它包含以下代码段: if resource.sign_in_count == 1 resource.send(:set_reset_password_to
if resource.sign_in_count == 1
resource.send(:set_reset_password_token)
edit_password_path(resource, reset_password_token: @token)
else
# etc
end
但当它沿着路径移动时,它会重定向到远离密码更改的位置,这似乎是因为Desive::PasswordsController中的这一行:
# Render the #edit only if coming from a reset password email link
append_before_filter :assert_reset_token_passed, only: :edit
所以我可以覆盖那个调用,但我很担心它为什么会出现在那里,以及它是否会导致其他问题——即使不会,我感觉我正在进行大量的黑客攻击,以实现我想象中相对常见的场景。有没有更巧妙的方法来解决这个问题
ETA:我已成功跳过过滤器,代码如下:
class PasswordsController < Devise::PasswordsController
skip_before_filter :require_no_authentication,
:assert_reset_token_passed,
only: :edit
end
类密码控制器
这在相关的用户旅程中起作用,但这是一个接受测试相对较少的应用程序,所以我有点担心这会在其他地方产生连锁反应——比如意外地要求用户在其他用户旅程中更改密码
是否有人建议使用这种方法是正常的,或者是否有更安全的替代方法?在应用程序控制器上,覆盖“在路径中签名后”方法。 使用sign_in_count测试是否为首次登录:
def after_sign_in_path_for(resource)
if current_user.sign_in_count == 1
edit_passwords_path
else
root_path
end
end
看,这似乎是你问题的答案,我们希望将他们发送到Desive password reset(设计密码重置)屏幕,而不是将他们引导到完整的配置文件编辑。我正在成功地将他们引导到edit_password(编辑密码)路径,但问题是,他们会立即被重定向,因为(我认为)通过了
append_before_filter(附加密码重置前过滤器):assert_reset_token(断言密码重置令牌),仅::编辑
行。就目前情况而言,我认为我可以让Desive不重定向(虽然我还没有真正做到这一点,所以我可能说得太早了),但我觉得Desive应该有一个更现成的解决方案。