Ruby 取消删除在设计登录时充当偏执删除用户
我有一个Rails 3.1.3应用程序,它使用Ruby 取消删除在设计登录时充当偏执删除用户,ruby,ruby-on-rails-3.1,devise,warden,acts-as-paranoid,Ruby,Ruby On Rails 3.1,Devise,Warden,Acts As Paranoid,我有一个Rails 3.1.3应用程序,它使用designe进行用户身份验证,并使用acts\u as\u paranoid软删除用户。我希望在重新创建密码、用户注册和用户登录时取消删除帐户,因此如果他们提供已删除的电子邮件,我会抓取该帐户,使其重新生效,然后继续操作(重新创建密码或登录) 但是在Users::sessioncontroller#create操作中,在取消删除用户后,会出现未经授权的错误(但是用户现在应该是可见的)。代码是: def create # Take into ac
designe
进行用户身份验证,并使用acts\u as\u paranoid
软删除用户。我希望在重新创建密码、用户注册和用户登录时取消删除帐户,因此如果他们提供已删除的电子邮件,我会抓取该帐户,使其重新生效,然后继续操作(重新创建密码或登录)
但是在Users::sessioncontroller#create
操作中,在取消删除用户后,会出现未经授权的错误(但是用户现在应该是可见的)。代码是:
def create
# Take into account acts_as_paranoid deleted users
resource = resource_class.only_deleted.find_by_email(params[resource_name][:email])
resource.undelete! if resource
resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
set_flash_message(:notice, :signed_in) if is_navigational_format?
sign_in(resource_name, resource)
respond_with resource, :location => after_sign_in_path_for(resource)
end
如果在取消删除后添加resource.reload
调用,则不会更改任何内容。如果我再次登录,用户将正常登录,因为它在上次尝试中被取消删除
为什么会这样?如何在一次
create
调用中取消删除并登录?使用以下代码片段解决了此问题:
def create
# Take into account acts_as_paranoid deleted users
if (resource = resource_class.only_deleted.find_by_email(params[resource_name][:email]))
resource.undelete!
# Copied from Warden::Strategies database_authenticatable:
sign_in resource if resource.valid_password?(params[resource_name][:password])
end
super
end
最新版本的Paranoia使用resource.restore!而不是resource.undelete!这似乎是一个潜在的安全漏洞。如果一个用户删除了她的帐户,那么稍后另一个人使用相同的电子邮件创建了一个用户,她将获得对被删除用户历史数据的访问权限。这种方法中的用户与以前一样经过身份验证:
resource.valid\u password?(params[resource\u name][:password])
。简单说明一下:对于偏执狂宝石,您需要调用resource.restore
(而不是resource.undelete!
)。另外,添加并返回<代码>登录资源并返回if resource.valid密码?(参数[resource\u name][:password])