【问题标题】:Devise: How to only authenticate users whom has a relation with another model?设计:如何只验证与另一个模型有关系的用户?
【发布时间】:2013-12-18 17:06:03
【问题描述】:

我有以下表格:

users
======
id
email
password
..device columns..

providers
==========
user_id
..irreverent columns..

consumers
==========
user_id
..irrelevant columns..  

消费者和提供者都属于users 表,我们使用这种设计是因为双方都可以访问网络应用程序的某些区域,但是,有时存在消费者不应该访问的特定于提供者的区域在,如供应商管理面板。

所以这引发了以下问题,当 Devise 只知道用户表而不知道提供者/消费者时,我如何让 Devise 只在提供者特定的命名空间上验证提供者而不是消费者? p>

这是我认为我应该做的:

controllers/provider/base_controller.rb:

  before_action :authenticate_provider!

  private
  #A modified wrapper around authenticate_user!
  def authenticate_provider! 
    authenticate_user!
    redirect_to sign_in_path unless Provider.find_by(user: current_user)
  end

【问题讨论】:

  • 当心那些不敬的列
  • 严肃一点,您提出的解决方案有什么问题?
  • @Slicedpan 其实没什么,我只是期待一个更优雅的解决方案,也许是来自 Devise 开箱即用的功能。
  • 语句'return false unless Provider.find_by(...)' 将始终返回 false 或 nil。

标签: ruby-on-rails ruby activerecord devise


【解决方案1】:

您可能需要考虑的几件事:

  1. 您可以为用户表创建角色属性,而不是为提供者和消费者使用单独的表。该设计似乎更适合您的需求。

  2. 如果您想根据用户是提供者还是消费者来限制对站点某些部分的访问,您需要的是授权而不是身份验证。假设您已经为您的用户设置了一个角色属性,您可以为不希望消费者访问的控制器操作编写如下代码:

#

def new
  redirect_to root_path, alert: "Unauthorized access." if current_user.role == "consumer"
end

如果有帮助,请告诉我。

【讨论】:

  • 要发布这个 - 你所追求的是授权,而不是身份验证。只需对用户进行身份验证,忽略他们的特定角色,然后在您希望限制的控制器操作的 before_filter 中检查 current_user 的角色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2014-12-26
  • 2018-12-29
  • 1970-01-01
  • 2021-12-09
  • 2012-12-10
  • 2023-03-18
相关资源
最近更新 更多