38

我正在使用devisegem,点击确认链接后,我想直接登录。目前它正在要求重新登录。

最近我在设计初始化文件中添加了以下内容:

config.allow_insecure_token_lookup = true
config.secret_key = 'a8d814803c0bcc735ce657adc77793459d00154cdd7532c13d3489600dc4e963f86e14beb593a32cbe9dbbe9197c9ce50a30102f363d90350052dc8d69930033'

有什么建议么?

4

6 回答 6

61

在以前的 Devise 版本中,用户在确认后会自动登录。这意味着任何可以访问确认电子邮件的人都可以通过单击链接登录某人的帐户。

自动登录用户也可能对电子邮件重新确认工作流程有害。假设用户决定更改他的电子邮件地址,并且在这样做的同时,他在新的电子邮件地址上打错了字。一封电子邮件将被发送到另一个地址,该地址拥有令牌,将能够登录该帐户。

如果用户立即更正电子邮件,则不会造成任何损害。但如果没有,其他人可以登录该帐户,而用户不会知道它发生了。

因此,Devise 3.1确认后不再自动登录用户。通过在 config/initializers/devise.rb 中设置以下内容,您可以在升级后暂时恢复旧行为:

config.allow_insecure_sign_in_after_confirmation = true

此选项仅可临时用于帮助迁移。

于 2013-09-06T10:42:43.920 回答
53

config.allow_insecure_sign_in_after_confirmationDevise 不再支持该标志。

虽然您应该知道在用户确认帐户时自动登录可能存在的安全问题(http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure -defaults/ ),对于某些应用程序而言,用户体验方面的好处可能值得安全权衡。

毕竟,安全风险在于 a) 用户输入错误的电子邮件,b) 他们没有立即纠正错误,c) 他们输入的电子邮件对应于有效且有效的电子邮件,d) 错误接收的人电子邮件将其打开并单击链接。

如果这是您的应用程序可接受的风险概况,您可以覆盖设计 ConfirmationsController:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])
    yield resource if block_given?

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_flashing_format?
      sign_in(resource) # <= THIS LINE ADDED
      respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
    else
      respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
    end
  end
end

并在你的路由到它routes.rb

devise_for :users, controllers: { confirmations: 'confirmations' }
于 2014-01-06T23:12:43.850 回答
16

使用较新版本的 Devise,您可以执行以下操作。

配置/路由.rb

devise_for :users, controllers: { confirmations: 'users/confirmations' }

应用程序/控制器/用户/confirmations_controller.rb

class Users::ConfirmationsController < Devise::ConfirmationsController
  def show
    super do |resource|
      sign_in(resource)
    end
  end
end
于 2014-09-16T09:44:34.980 回答
3

看mb21的回答,应该是

def show
  super do |resource|
    if resource.confirmation_sent_at > DateTime.now-2.hours && resource.errors.empty?
      sign_in(resource)
    end
  end
end

确认发送时间是电子邮件发送给用户的时间,与确认时间相反,确认时间是用户点击链接的时间,它总是在服务器上的 2 小时内发生...

于 2016-05-18T04:27:41.910 回答
1

在这里,您有如何解决它。

此代码将允许用户在确认后自动登录,仅当是第一次确认他/她的帐户时。

class ConfirmationsController < Devise::ConfirmationsController
  before_action :maybe_auto_sign_in, only: :show

  protected

  def after_confirmation_path_for(resource_name, resource)
    sign_in(resource) if @auto_sign_in
    super
  end

  private

  # Automatically sign in the user that confirmed his/her email first time.
  def maybe_auto_sign_in
    @auto_sign_in =
      User.first_time_confirming?(params[:confirmation_token])
  end
end

class User < ActiveRecord::Base
  def self.first_time_confirming?(confirmation_token)
    confirmation_token &&
      User.where(confirmation_token: confirmation_token, unconfirmed_email: nil)
          .exists?
  end
end
于 2018-09-27T10:29:06.447 回答
1

我们希望用户在创建用户 2 小时或更短时间后单击电子邮件中的链接时自动登录。根据@Sjor 的回答,我们选择了:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    super do |resource|
      if resource.confirmed_at > DateTime.now-2.hours && resource.errors.empty?
        sign_in(resource)
      end
    end
  end
end
于 2016-03-18T12:31:43.050 回答