Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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 取消删除在设计登录时充当偏执删除用户_Ruby_Ruby On Rails 3.1_Devise_Warden_Acts As Paranoid - Fatal编程技术网

Ruby 取消删除在设计登录时充当偏执删除用户

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

我有一个Rails 3.1.3应用程序,它使用
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])