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

标签 ruby-on-rails ruby-on-rails-3 devise warden devise-confirmable

我使用 Rails 堆栈

  • 设计
  • jail 长
  • 可确认

  • 现在我对电子邮件确认和对未经验证的用户的访问提供了一定的要求。假设有 3 类页面:
  • case 1 - 不需要身份验证。
  • case 2 - 需要身份验证,还需要用户确认。
  • case 3 - 需要身份验证(正确的用户名和密码组合),但无需确认用户即可访问它们。

  • 随着设计和确认,实现case 1case 2是微风。一旦用户登录/注册,我重定向到“确认您的电子邮件页面”。

    我的问题是 case 3 .假设用户登录/注册。他尚未确认他的电子邮件地址,但应该被允许访问某些 case 3路线。当他访问案例 3 路线时,我期望:
  • 没有重定向
  • 有效 session

  • 带有可确认的设计要么允许所有页面都被确认的用户访问,要么不访问。它不允许通过身份验证但未经确认访问某些页面。

    我尝试覆盖设计 confirmed?通过实现这个逻辑:
    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
    

    这几乎不适用于登录,但不适用于注册。此外,这是实现它的一种非常糟糕的方式。我应该如何解决这个问题?其他功能工作正常。

    最佳答案

    而不是覆盖 confirmed?你可以覆盖 confirmation_required?模型方法(docs) :

    # user.rb
    class User < ActiveRecord::Base
      protected
    
      def confirmation_required?
        false
      end
    end
    

    之后,您可以自己处理确认逻辑,方法是在 before_action 中重定向所有未确认的用户。当 Controller 需要确认时,或者您可以将其拉入您的授权逻辑(例如使用专家)。
    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-on-rails - 允许未经确认的用户访问某些需要身份验证的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51724589/

    相关文章:

    ruby-on-rails - Rails 3 CSRF token 仍然提交

    ruby-on-rails - 未初始化的常量 ThinkingSphinx::Deltas::DelayedDelta

    ruby-on-rails-3 - 在开发中直接服务 Assets (无 Assets 管道)?

    ruby-on-rails - 使用设计动态设置用户时区

    ruby-on-rails - 如何将 Tire (elasticsearch) 中的 facet 添加到 has_many 关联

    html - 在 HAML 中递增 ID 的最简单方法是什么?

    ruby-on-rails - 如何在中间件中设置 current_user?

    ruby-on-rails - Rails Devise 发送邮件

    ruby-on-rails - 检查字符串是否为 base64

    javascript - 如何在提交之前运行 javascript 函数?