确认链接点击使用devisegem后避免login?

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

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

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

有什么build议么?

在之前的Devise版本中,用户在确认后自动login。 这意味着任何可以访问确认电子邮件的人都可以通过点击链接login到某人的账户。

在电子邮件重新确认工作stream程中自动签署用户也可能有害。 想象一下,用户决定改变他的电子邮件地址,并在这样做的时候,在新的电子邮件地址上input一个错字。 电子邮件将被发送到另一个地址,手中的令牌将能够login到该帐户。

如果用户马上纠正电子邮件,不会造成任何伤害。 但是,如果没有,其他人可以login到该帐户,用户不知道它发生了。

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

config.allow_insecure_sign_in_after_confirmation = true

此选项只能暂时用于帮助迁移。

Devise不再支持config.allow_insecure_sign_in_after_confirmation标志。

尽pipe您应该了解在确认帐户时自动logging用户的安全隐患( http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure -defaults / ),对于某些应用程序,用户体验方面的好处可能值得安全折衷。

毕竟,安全风险在于:a)用户错误地键入他们的电子邮件,b)他们不能立即纠正他们的错误,c)他们键入的电子邮件对应于有效的工作电子邮件,d)错误地接收的人电子邮件打开并点击链接。

如果这是您的应用程序可接受的风险configuration文件,则可以覆盖deviseConfirmationsController:

 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' } 

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

config / routes.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 

看mb21的答案,应该是

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

confirmation_sent_at是电子邮件发送给用户的时间,而不是confirm_at,这是用户点击链接的时刻,当服务器发生这种情况时,它始终在服务器的2小时之内。

如果用户创build后点击电子邮件中的链接2个小时以内,我们希望用户自动login。 基于@ 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