我在我的应用上安装了Devise gem。我的应用程序中也有几个帖子模型。例如,我有一个帖子模型供人们在各种微信模型中讨论'篮球','棒球'和'足球'。
但是,我想根据他们在使用Devise注册时提供的信息限制某些用户在特定模型中发布。例如,要在Basketball模型中发布,您必须提供邮政编码04583,34039或49492.如果没有,用户将无法发布。
这可能吗?我认为它原本可以用CanCan宝石,但现在我不确定。
谢谢!
答案 0 :(得分:2)
小心不要将身份验证与授权混淆。设计用于身份验证,即用户就是他所说的人。你想要的是一种授权某些用户做某些事情的方法。
cancan gem 是这样做的好方法,但后来被cancancan取代,cancancan将完全按照你的意愿行事。查看有关定义能力的wiki,以便更好地了解这是如何完成的。
请注意,您的授权方法完全独立于Devise,但您仍然可以使用您希望的用户的任何属性,即使这些属性是通过注册表单获得的。
答案 1 :(得分:0)
首先,身份验证/授权将在您的控制器中进行,而不是在您的模型中进行。根据适当的MVC架构,您的模型并不关心谁是谁。
要添加授权(我假设您已经处理过身份验证),您可以向ApplicationController
添加以下内容:
def require_whatever_privilege
unless <whatever your criteria is>
# Option 1 – Raise a routing error:
raise ActionController::RoutingError.new("You don't have access to this!")
# Option 2 – Render a 403 page, if you have one:
return render file: 'public/403.html', status: :forbidden
end
end
然后,您只需将过滤器添加到您想要在其中使用的控制器中:
before_action :require_whatever_privilege
或者,如果您只想在控制器上使用特定方法的过滤器,您可以这样做:
before_action :require_whatever_privilege, only: :index