在我的Rails项目中,我有不同类型的用户,其中一个具有user_status :admin
,与其他用户不同,它具有编辑内容的完全权限。出于显而易见的原因,我想为这些类型的用户添加额外的安全性,特别是完全禁用密码恢复。
覆盖标准Devise密码恢复(:recoverable
设计模块)方法的正确方法是什么,以便当用户尝试为管理员用户(user_status == "admin"
用户获取重置密码链接时)系统返回“未找到标准电子邮件”消息?
这有点像未回答的问题:Restrict Devise password recovery to only certain users
提前谢谢。
答案 0 :(得分:7)
我选择的方法对我有用,它通过将以下内容添加到send_reset_password_instructions
来覆盖用户模型的models/user.rb
方法:
def send_reset_password_instructions
return false if self.user_status == 'admin'
super
end
这使得Devise在电子邮件属于管理员帐户时不会做任何事情。
答案 1 :(得分:1)
未经过测试,但我认为您可以覆盖用户模型中的reset_password!
,如下所示:
def reset_password!(new_password, new_password_confirmation)
return false if user_status == 'admin'
super
end
如果用户是管理员,则可以防止重置密码。
我不知道这是否是最好的覆盖方法,有更多设计可恢复的方法可以在您的用户模型中被覆盖,即send_reset_password_instructions
。检查manual是否有所有有趣的方法。
答案 2 :(得分:0)
对于任何将来的观看者,这是另一种实现方式。 Vitaly的示例确实对我有用,但是我仍然收到“您的密码电子邮件已发送”的信息。通知(我想闪烁一个单独的警报),所以我走了另一条路线。
扩展Devise :: PasswordsController对我来说是最简单的解决方案:
class Devise::Extends::PasswordsController < Devise::PasswordsController
def create
if some_condition?
redirect_to :root
flash[:alert] = 'You cannot reset your password, buddy.'
else
super
end
end
然后,在routes.rb中:
devise_for :users, controllers: { passwords: 'devise/extends/passwords' }
这会将您的应用程序定向到扩展控制器,然后在不满足条件的情况下点击设计控制器(“超级”)。
答案 3 :(得分:0)
Snippet above效果很好!
我遇到的一些小问题如下:
uninitialized constant Devise::Extends (NameError)
(可能是由于旧的ruby版本造成的?),则可以使用嵌套模块定义。下面是更新的代码段。
module Devise
module Extends
class PasswordsController < Devise::PasswordsController
skip_before_filter :authenticate_user!, :only => [ :edit ]
def edit
redirect_to "https://www.google.com/"
end
end
end
end