使用除User以外的型号进行rails应用程序中的间隙认证

时间:2013-12-26 05:40:33

标签: ruby-on-rails authentication model clearance

我有一个rails应用程序,它使用clearance和cancan gems进行身份验证和授权。最初,应用程序使用User model作为Clearance使用的user_model。现在,由于一些设计更改,我们希望另一个模型类Person由Clearance用作user_model。 Person模型已经到位,并且在应用程序的上下文中具有特定于Person模型的列。

Rails版本:3.2.14
Ruby版本:1.9.3-p487
清仓版:0.16.3

为实现这一目标,我们进行了以下更改:

  1. 从用户模型清除到人员模型所需的已迁移字段(email,encrypted_pa​​ssword,remember_token,salt,confirmation_token)。
  2. 制作人员模型包括Clearance :: User
  3. 根据http://rubydoc.info/github/thoughtbot/clearance/frames

    中的建议更改了清除初始值设定项以设置* user_model = Person *
    Clearance.configure do |config|
      config.user_model = Person
    end
    
  4. 更新了Person模型的工厂定义,如下所示:

    FactoryGirl.define do
      sequence(:email) {|n| "user#{n}@example.com" }
      factory :person do
        ignore do
          group nil
        end
        email
        password { "password" }
        company
        first_name { FactoryGirl.generate(:name).capitalize }
        last_name  "Test"
        groups { [group || FactoryGirl.create(:group)] }
      end
    end
    
  5. 在这些更改之后,当我运行与人员相关的规范时,它无法使用工厂创建人员对象。我得到以下问题。

        1) Person 
           Failure/Error: it { should validate_presence_of(:first_name) }
           NameError: undefined local variable or method `encrypted_password' for #<Person:0x00000001e7bcc8>
           # ./spec/models/person_spec.rb:8:in `block (2 levels) in <top (required)>'
    

    我参考了文档,谷歌群组的主题,用于清除组,论坛帖子但无法解决问题。有人做过类似的吗?你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

看起来您的Person类没有encrypted_pa​​ssword列。确保它有这个,以及下面的字段

t.string :email
t.string :encrypted_password, :limit => 128
t.string :confirmation_token, :limit => 128
t.string :remember_token, :limit => 128

如果您发布schema.rb或person.rb文件,则可以确认。