身份验证:是否可以使用 Devise 注册凭据来限制或授予对 post 模型的访问权限?
Authentication: Is it possible to use Devise sign up credentials to either restrict or grant access to the post model?
我在我的应用程序上安装了 Devise gem。我的应用程序中还有几个 post 模型。比如我有一个post模型供大家讨论'Basketball'、'Baseball,'和'Soccer'各种微post模型
但是,我想根据某些用户在注册 Devise 时提供的信息,限制某些用户 post 使用某些型号。例如,篮球模型中的 post,您必须提供邮政编码 04583、34039 或 49492。否则,用户将无法 post。
这可能吗?我认为 CanCan gem 最初是可能的,但现在我不确定。
谢谢!
注意不要混淆身份验证和授权。 Devise 用于身份验证,即用户是他所说的人。您想要的是一种授权 某些用户做某些事情的方法。
康康舞 gem 是实现此目的的好方法,但此后已被康康康乐取代,康康康乐将完全满足您的要求。查看 wiki 关于定义能力的内容,以便更好地了解这是如何完成的。
请注意,您的授权方法完全独立于 Devise,但您仍然可以使用您想要的用户的任何属性,即使它们是通过注册表单获得的。
首先,authentication/authorization 将发生在您的控制器中,而不是您的模型中。根据适当的 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
我在我的应用程序上安装了 Devise gem。我的应用程序中还有几个 post 模型。比如我有一个post模型供大家讨论'Basketball'、'Baseball,'和'Soccer'各种微post模型
但是,我想根据某些用户在注册 Devise 时提供的信息,限制某些用户 post 使用某些型号。例如,篮球模型中的 post,您必须提供邮政编码 04583、34039 或 49492。否则,用户将无法 post。
这可能吗?我认为 CanCan gem 最初是可能的,但现在我不确定。
谢谢!
注意不要混淆身份验证和授权。 Devise 用于身份验证,即用户是他所说的人。您想要的是一种授权 某些用户做某些事情的方法。
康康舞 gem 是实现此目的的好方法,但此后已被康康康乐取代,康康康乐将完全满足您的要求。查看 wiki 关于定义能力的内容,以便更好地了解这是如何完成的。
请注意,您的授权方法完全独立于 Devise,但您仍然可以使用您想要的用户的任何属性,即使它们是通过注册表单获得的。
首先,authentication/authorization 将发生在您的控制器中,而不是您的模型中。根据适当的 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