38

我以前在我的网站上实施了 Authlogic 以进行授权。但是现在我希望改用 Devise,我想知道是否有人对此有任何经验。也许有人看过有关该主题的博客文章?

谢谢你。

4

4 回答 4

48

我自己最近从 Authlogic 切换到了 Devise,也没有找到任何文章。然而,在简单的情况下,一旦你丢弃了所有的 user_session 和其他与 authlogic 相关的代码,主要的工作就是将旧的 users 表转换为设计所期望的格式。

我的旧表是这样的:

      Column       |           Type           |                     Modifiers                      
-------------------+--------------------------+----------------------------------------------------
 id                | integer                  | not null default nextval('users_id_seq'::regclass)
 login             | character varying(256)   | not null
 password          | character varying(64)    | not null
 created_at        | timestamp with time zone | not null
 updated_at        | timestamp with time zone | not null
 persistence_token | character varying(255)   | not null
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "index_users_on_persistence_token" UNIQUE, btree (persistence_token)
    "users_login_key" UNIQUE, btree (login)

我确定该表必须至少包含以下设计信息(启用了许多可选功能):

 id                   | integer                     | not null default nextval('contributors_id_seq'::regclass)
 email                | character varying(255)      | not null default ''::character varying
 encrypted_password   | character varying(128)      | not null default ''::character varying
 password_salt        | character varying(255)      | not null default ''::character varying
 confirmation_token   | character varying(255)      | 
 confirmed_at         | timestamp without time zone | 
 confirmation_sent_at | timestamp without time zone | 
 reset_password_token | character varying(255)      | 
 remember_token       | character varying(255)      | 
 remember_created_at  | timestamp without time zone | 
 sign_in_count        | integer                     | default 0
 current_sign_in_at   | timestamp without time zone | 
 last_sign_in_at      | timestamp without time zone | 
 current_sign_in_ip   | character varying(255)      | 
 last_sign_in_ip      | character varying(255)      | 
 failed_attempts      | integer                     | default 0
 unlock_token         | character varying(255)      | 
 locked_at            | timestamp without time zone | 
 created_at           | timestamp without time zone | 
 updated_at           | timestamp without time zone | 

所以我在迁移类中定义了一个朴素的activerecord类

 class ConversionUser < ActiveRecord::Base
   set_table_name "users"
 end

然后这是我最终使用的“向上”迁移代码(使用 PostgreSQL):

add_column :users, :email, :string, :limit => 255
execute "UPDATE users SET email = login || '@somedomain.net'"
execute "ALTER TABLE users ALTER email SET NOT NULL"

add_column :users, :encrypted_password, :string, :limit => 128
add_column :users, :password_salt, :string, :limit => 255

require 'devise/encryptors/bcrypt'
ConversionUser.find(:all).each do |u|
  password_salt = Devise::Encryptors::Bcrypt.salt(Devise.stretches)
  u.update_attributes!(:password_salt => password_salt,
                       :encrypted_password => Devise::Encryptors::Bcrypt.digest(u.password, Devise.stretches, password_salt, Devise.pepper))
end

add_column :users, :confirmation_token, :string, :limit => 255
add_column :users, :confirmed_at, :timestamp
add_column :users, :confirmation_sent_at, :timestamp
execute "UPDATE users SET confirmed_at = created_at, confirmation_sent_at = created_at"
add_column :users, :reset_password_token, :string, :limit => 255

add_column :users, :remember_token, :string, :limit => 255
add_column :users, :remember_created_at, :timestamp
add_column :users, :sign_in_count, :integer, :default => 0
add_column :users, :current_sign_in_at, :timestamp
add_column :users, :last_sign_in_at, :timestamp
add_column :users, :current_sign_in_ip, :string, :limit => 255
add_column :users, :last_sign_in_ip, :string, :limit => 255

add_column :users, :failed_attempts, :integer, :default => 0
add_column :users, :unlock_token, :string, :limit => 255
add_column :users, :locked_at, :timestamp

remove_column :users, :password
remove_column :users, :persistence_token

add_index :users, :email,                :unique => true
add_index :users, :confirmation_token,   :unique => true
add_index :users, :reset_password_token, :unique => true
add_index :users, :unlock_token,         :unique => true

请注意,这里我已将普通密码列转换为 Devise 的 bcrypt 加密列——如果您使用 Authlogic 的加密密码,那么您可能只想重命名该列(如有必要)并选择正确的中的加密模块config/initializers/devise.rb

作为参考,我的用户模型中的“设计”子句如下所示:

devise :database_authenticatable, :registerable, :recoverable,
  :rememberable, :trackable, :validatable, :confirmable, :lockable,
  :timeoutable, :authentication_keys => [ :login ]

请注意,:authentication_keys像这样覆盖以便用户使用他们的登录名而不是他们的电子邮件地址登录需要我修改一些设计视图:rails generate devise:views,然后编辑文件。

希望这个对你有帮助。祝你好运!

于 2010-10-02T16:23:25.760 回答
21

sanityinc 的回答很棒!非常感谢!

但是我有一个带有加密密码的不同版本的 authlogic,我最终的向上迁移是:

rename_column :users, :crypted_password, :encrypted_password

add_column :users, :confirmation_token, :string, :limit => 255
add_column :users, :confirmed_at, :timestamp
add_column :users, :confirmation_sent_at, :timestamp
execute "UPDATE users SET confirmed_at = created_at, confirmation_sent_at = created_at"
add_column :users, :reset_password_token, :string, :limit => 255

add_column :users, :remember_token, :string, :limit => 255
add_column :users, :remember_created_at, :timestamp
rename_column :users, :login_count, :sign_in_count
rename_column :users, :current_login_at, :current_sign_in_at
rename_column :users, :last_login_at, :last_sign_in_at
rename_column :users, :current_login_ip, :current_sign_in_ip
rename_column :users, :last_login_ip, :last_sign_in_ip

rename_column :users, :failed_login_count, :failed_attempts
add_column :users, :unlock_token, :string, :limit => 255
add_column :users, :locked_at, :timestamp

remove_column :users, :persistence_token
remove_column :users, :perishable_token
remove_column :users, :single_access_token

add_index :users, :email,                :unique => true
add_index :users, :confirmation_token,   :unique => true
add_index :users, :reset_password_token, :unique => true
add_index :users, :unlock_token,         :unique => true

.. 它对 MySQL 非常有用。

于 2010-11-22T20:31:42.337 回答
6

如果您在用户登录时遇到“无效哈希”错误,请在用户模型中添加 :encryptable。我已经从 authlogic 迁移到设计。我的数据库是 MySQL。

于 2011-01-11T02:39:24.013 回答
5

如果您遇到加密器错误,请尝试在devise.rb配置中更改这些:

config.stretches = 20
config.encryptor = :authlogic_sha512
于 2011-03-21T02:26:28.917 回答