我使用 Rails 堆栈
现在我对电子邮件确认和对未经验证的用户的访问提供了一定的要求。假设有 3 类页面:
case 1
- 不需要身份验证。 case 2
- 需要身份验证,还需要用户确认。 case 3
- 需要身份验证(正确的用户名和密码组合),但无需确认用户即可访问它们。 随着设计和确认,实现
case 1
和 case 2
是微风。一旦用户登录/注册,我重定向到“确认您的电子邮件页面”。我的问题是
case 3
.假设用户登录/注册。他尚未确认他的电子邮件地址,但应该被允许访问某些 case 3
路线。当他访问案例 3 路线时,我期望:带有可确认的设计要么允许所有页面都被确认的用户访问,要么不访问。它不允许通过身份验证但未经确认访问某些页面。
我尝试覆盖设计
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/