2017-01-30 41 views
1

[ETA在年底更新了我目前的解决方案]强制用户第一次登录时重置密码与设计

我希望能够手动创建高价值用户的帐户,这意味着我们必须生成一个密码他们并让他们在首次登录时进行更改。我找到了一个解决方案来做到这一点here,但它似乎在Devise而不是它的工作。

我现在的努力是覆盖在设计ConfirmationsController的#after_confirmation_path_for方法,使其包含这个片段:

if resource.sign_in_count == 1 
    resource.send(:set_reset_password_token) 
    edit_password_path(resource, reset_password_token: @token) 
else 
    # etc 
end 

但是,当它遵循的路径,它从密码更改因为重定向看似远,该线路设计:: PasswordsController:

# Render the #edit only if coming from a reset password email link 
append_before_filter :assert_reset_token_passed, only: :edit 

所以,我可以覆盖该电话,但我警惕,为什么它在那里摆在首位,以及是否可能导致其他的问题 - 即使不是,它感觉就像我是d做了大量的黑客行为,以使我能想象的情景相对普遍。有更多的设计方法来解决这个问题吗?

ETA:我做了这个成功跳过过滤器使用下面的代码:

class PasswordsController < Devise::PasswordsController 
    skip_before_filter :require_no_authentication, 
        :assert_reset_token_passed, 
        only: :edit 
end 

这是工作中的相关用户的旅程,但这是相对较少的验收测试的应用程序,所以我m稍微谨慎一点,这会在其他地方产生连锁效应 - 例如意外地要求用户在其他用户旅程中更改密码。

任何人都可以建议使用这种方法是正常的,还是有一个更安全的选择?

+0

看[这里](http://stackoverflow.com/a/29416605/1520965),似乎在回答你的问题 –

+0

我们想送他们到设计密码重置屏幕,而不是指导他们到完整的配置文件编辑。 – Arepo

回答

1

在您的应用程序控制器上,覆盖“after_sign_in_path”方法。 使用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 
+0

我成功地将他们引导到edit_password_path,但问题是他们立即被重定向,因为(我认为)'append_before_filter:assert_reset_token_passed,只有::编辑'行。根据情况,我认为我可以破解设计不重定向(虽然我还没有真正做出这项工作,所以也许我说得太快),但感觉就像我期望Devise有更现成的东西解决方案。 – Arepo

相关问题