设计:如何仅验证与其他模型有关系的用户?

时间:2013-12-18 17:06:03

标签: ruby-on-rails ruby activerecord devise

我有以下表格:

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

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

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

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

因此,这提出了以下问题:如果只知道提供者特定的命名空间而不是提供者/消费者,我如何让Devise只对提供者而不是特定于提供者的命名空间的消费者进行身份验证?

以下是我认为我应该做的事情:

控制器/提供者/ 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

1 个答案:

答案 0 :(得分:1)

您可能需要考虑的一些事项:

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

  2. 如果要根据用户是提供者还是消费者来限制对站点某些部分的访问,则需要授权而不是身份验证。假设您已经拥有了用户的角​​色属性,那么您可以使用以下代码来执行您不希望消费者访问的控制器操作:

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

    如果有帮助,请告诉我。