【问题标题】:Using devise with two types of similar users将设计与两种类型的相似用户一起使用
【发布时间】:2011-02-01 14:34:08
【问题描述】:

我知道这个问题已经被问过很多次了,但我找不到一个好的答案。

我将在我的应用程序中同时包含商家和用户。两者的表结构几乎相同,所以我更喜欢使用一个表和一个名为“is_merchant”的布尔字段。

我希望使用单独的注册页面(用户/新用户和商家/新用户),但希望所有用户共享同一个登录页面 (/login)。

我非常想使用 Devise 进行身份验证。然而,用设计这种类型的系统似乎很难达到。是这样吗?我可以看看有什么好的指南或提示吗?如果 Devise 不是解决此问题的最佳解决方案,是否有其他身份验证系统的建议(注意:希望将来可以轻松添加 Facebook 身份验证)?

非常感谢!

【问题讨论】:

    标签: ruby-on-rails authentication architecture devise single-table-inheritance


    【解决方案1】:

    您是否考虑过使用角色?您可以为此使用 cancan gem。您可能需要的不仅仅是“is_merchant”。例如,“is_admin”呢?那时你最好使用角色。 https://github.com/ryanb/cancan

    您可以稍后使用 Omni-auth 添加 Facebook 身份验证。

    需要明确的是,Devise 用于包含您自己的身份验证系统,而 Omni-auth 用于通过 Facebook、Twitter 等网站进行身份验证。

    【讨论】:

    • 非常感谢 - 我会好好看看 CanCan。然而,这仍然让我对我最初的问题感到“黑暗”。
    • 您可以使用 Devise(目前直接支持 Omni-auth)和 cancan 一起做您所描述的事情。看看这个例子为 devise + cancan tonyamoyal.com/2010/07/28/…
    【解决方案2】:

    您还可以删除用户模型中设计的:validatable 模块规范,并添加validates_uniqueness_of 并将:scope 设置为:is_merchant。这允许您使用 ActiveRecord 验证方法而不是 Devise 的验证方法。

    validates_uniqueness_of 中使用:scope 可以验证多列的唯一性。

    user.rb:

    class User < ActiveRecord::Base
    
      # ...
    
      validates_uniqueness_of :email, :scope => :is_merchant
    
      # Include default devise modules. Others available are:
      # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable #, :validatable <- removed
    
      # ...
    
    end
    

    在您的新用户注册视图中,在您的注册表单中指定 is_merchant 值。

    new.html.erb

    <%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
    
      <%=f.hidden_field :is_merchant, :value => 1 %> # used hidden for my implementation
    
      # ... other inputs
    
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多