ruby-on-rails – 允许未经证实的用户访问需要身份验证的某些页面

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 允许未经证实的用户访问需要身份验证的某些页面前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用Rails堆栈

>设计
>监狱长
>确认

现在我对未经验证的用户的电子邮件确认和访问提供有一定的要求.假设有3类页面

>案例1 – 不需要身份验证.
>案例2 – 需要身份验证,还需要确认用户.
>案例3 – 需要身份验证(正确的用户名和密码组合),但无需确认用户访问它们.

通过设计和确认,实施案例1和案例2是轻而易举的.用户登录/注册后,我会重定向到“确认您的电子邮件页面”.

我的问题是案例3.假设用户进行了登录/注册.他尚未确认他的电子邮件地址,但应该允许访问某些案例3的路线.当他访问案例3路线时,我希望:

>没有重定向
>有效会话

使用确认设计允许确认用户访问所有页面或不允许访问所有页面.它不允许访问具有身份验证但未经确认的某些页面.

我试过压倒设计确认了吗?通过实现这个逻辑:

class ApplicationController < ActionController::Base
   before_filter :verify_user
   def verify_user
       $flag = true if CERTAIN_ROUTES.include?(action_class)
   end
end

class User < ActiveRecord::Base
   def confirmed?
      $flag || !!confirmed_at
   end
end

这几乎不适用于登录,但不适用于注册.而且,这是实现它的极其糟糕的方法.我该如何处理这个问题?其他功能很好.

解决方法

而不是覆盖确认?你可以覆盖confirm_required吗?模型方法 (docs)
# user.rb
class User < ActiveRecord::Base
  protected

  def confirmation_required?
    false
  end
end

之后,您可以自己处理确认逻辑,通过在控制器需要确认时重定向before_action中的所有未确认用户,或者您可以将其拉入授权逻辑(例如,使用权威).

class ApplicationController < ActionController::Base
   def needs_confirmation
     redirect_to root_path unless current_user.confirmed?
   end
end

class SomeController < ApplicationController
  before_action :needs_confirmation
end

猜你在找的Ruby相关文章