Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 强制用户在首次使用Desive登录时重置密码_Ruby On Rails_Ruby On Rails 4_Devise - Fatal编程技术网

Ruby on rails 强制用户在首次使用Desive登录时重置密码

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

[最后使用我当前的解决方案更新了ETA]

我希望能够为高价值用户手动创建帐户,这意味着我们必须为他们生成密码,并让他们在第一次登录时更改密码。我找到了一个解决办法,但它似乎是围绕着设计而不是使用它

我目前的工作是覆盖Deviate ConfirmationController中方法的#after_confirmation _path",以便它包含以下代码段:

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应该有一个更现成的解决方案。