2011-01-11 19 views
19

कई रेल 2.3 ऐप्स आराम से प्रमाणीकरण का उपयोग कर रहे हैं लेकिन उस प्लगइन में रेल के साथ कुछ समस्याएं हैं। रेल 3 में अपग्रेड करने में मैं डेविस का उपयोग कर रहा हूं। क्या आराम से प्रमाणीकरण से डेविस तक आसानी से संक्रमण करने का कोई तरीका है? क्या किसी ने माइग्रेशन किया है जो दिखाता है कि उपयोगकर्ता मॉडल को कैसे अपडेट किया जाए?आराम से प्रमाणीकरण से लेकर

उत्तर

14

मैंने अपने एप्लिकेशन को पहले से ही विश्वसनीय प्रमाणीकरण से अद्यतन करने के लिए अपडेट किया है। यहां मेरा माइग्रेशन है:

class AlterUsersForDevise < ActiveRecord::Migration 
    def self.up 
    remove_column :users, :name 
    change_column :users, :email, :string, :default => "", :null => false, :limit => 128 
    rename_column :users, :crypted_password, :encrypted_password 
    change_column :users, :encrypted_password, :string, :limit => 128, :default => "", :null => false 
    rename_column :users, :salt, :password_salt 
    change_column :users, :password_salt, :string, :default => "", :null => false, :limit => 255 
    add_column :users, :reset_password_token, :string 
    change_column :users, :remember_token, :string, :limit => 255 
    rename_column :users, :remember_token_expires_at, :remember_created_at 

    add_column :users, :sign_in_count, :integer, :default => 0 
    add_column :users, :current_sign_in_at, :datetime 
    add_column :users, :last_sign_in_at, :datetime 
    add_column :users, :current_sign_in_ip, :string 
    add_column :users, :last_sign_in_ip, :string 

    rename_column :users, :activation_code, :confirmation_token 
    change_column :users, :confirmation_token, :string, :limit => 255 
    rename_column :users, :activated_at, :confirmed_at 

    add_column :users, :confirmation_sent_at, :datetime 
    end 

    def self.down 
    add_column :users, :name, :string, :limit => 100, :default => "" 
    rename_column :users, :encrypted_password, :crypted_password 
    change_column :users, :crypted_password, :string, :limit => 40 
    rename_column :users, :password_salt, :salt 
    change_column :users, :salt, :string, :limit => 40 
    remove_column :users, :reset_password_token 
    change_column :users, :remember_token, :string, :limit => 40 
    rename_column :users, :remember_created_at, :remember_token_expires_at 

    remove_column :users, :sign_in_count 
    remove_column :users, :current_sign_in_at 
    remove_column :users, :last_sign_in_at 
    remove_column :users, :current_sign_in_ip 
    remove_column :users, :last_sign_in_ip 

    rename_column :users, :confirmation_token, :activation_code 
    change_column :users, :confirmation_token, :string, :limit => 40 
    rename_column :users, :confirmed_at, :activated_at 

    remove_column :users, :confirmation_sent_at 
    end 
end 

मेरा आवेदन अब तक लाइव नहीं है। इसलिए मैं डिवाइसेज से पासवर्ड एन्क्रिप्शन को बदले में एक अधिकृत प्राधिकरण से उपयोग करता हूं। यदि आप पहले से ही जिंदा हैं, और आपके पास सक्रिय उपयोगकर्ता हैं तो आपको विश्वसनीय प्रमाणीकरण से SHA1 का उपयोग करने के लिए Devise को कॉन्फ़िगर करना चाहिए और पासवर्ड को डिक्रिप्ट करना चाहिए। अन्यथा आपके सभी उपयोगकर्ताओं को एक नया पासवर्ड अनुरोध करना होगा।

आप इसे डिवाइज प्रारंभकर्ता में कॉन्फ़िगर कर सकते हैं।

आशा है कि मदद करता है ...

+0

धन्यवाद, यह काम करता है।मुझे एक अतिरिक्त समस्या थी जिसे मैंने नीचे दिए गए 2 उत्तरों में संबोधित किया था। –

2

मैं पासवर्ड एन्क्रिप्शन के साथ समस्या हो गई थी (लेकिन मैं इस सवाल का जवाब मिल गया, मेरे दूसरे प्रतिक्रिया देखें)। पुराना ऐप आराम से प्रमाणीकरण का पुराना संस्करण इस्तेमाल करता था। यह बहुत की तरह पासवर्ड एन्क्रिप्शन से निपटने गया था:

# before filter 
def encrypt_password 
    return if password.blank? 
    self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--") if new_record? 
    self.crypted_password = encrypt(password) 
end 

# Encrypts some data with the salt. 
def self.encrypt(password, salt) 
    Digest::SHA1.hexdigest("--#{salt}--#{password}--") 
end 

# Encrypts the password with the user salt 
def encrypt(password) 
    self.class.encrypt(password, salt) 
end 

अगर मैं विधि तैयार की config.encryptor:restful_authentication_sha1 को यह काम नहीं करता। इसलिए जैसे devise.rb में यह चयन

# /config/initializers/devise_encryptor.rb 
require "digest/sha1" 

module Devise 
    module Encryptors 
    class OldRestfulAuthentication < Base 
     def self.digest(password, stretches, salt, pepper) 
     Digest::SHA1.hexdigest("--#{salt}--#{password}--") 
     end 
    end 
    end 
end 

और फिर:

तुम इतनी तरह एक कस्टम encryptor बनाने की जरूरत है:

+0

मेरे समाधान को दूसरे उत्तर में देखें। –

11

यहाँ कैसे पासवर्ड समस्या को दूर करने के लिए

config.encryptor = :old_restful_authentication 

कि यह करना चाहिए!

15

यहाँ तैयार करने के लिए संपादित करें

https://github.com/plataformatec/devise/wiki/How-To:-Migrate-from-restful_authentication-to-Devise

कारण restful_authentication से प्रवास पर एक अच्छा गाइड है: पूर्व लिंक एक रिक्त पृष्ठ के लिए लोगों को ले लिया।

+0

ने उस लिंक को सही किया जो पहले एक रिक्त पृष्ठ का नेतृत्व करता था जो कहता है, "नया पृष्ठ बनाएं।" – Jay

1

मेरे मामले यह काम करता है में (पुराने मणि restful_authenticationमें authentication.rb और by_password.rb analized):

config/initializers/devise.rb इस जोड़ें:

config.encryptor = :restful_authentication 
config.stretches = 10 #REST_AUTH_DIGEST_STRETCHES frome Restful Authentication file config/initializers/site_key.rb 
config.pepper = 'mashauronilavrechkumyachik' #REST_AUTH_SITE_KEY frome Restful Authentication file config/initializers/site_key.rb 

ऐप/मॉडल/user.rb जोड़ें: एन्क्रिप्टेबल

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, 
     :encryptable, :omniauthable, :authentication_keys => [:login] 

config/initializers/devise_encryptor.rb इस इस के साथ बनाने के लिए:

# -*- encoding : utf-8 -*- 
require "digest/sha1" 

module Devise 
    module Encryptable 
    module Encryptors 
     class RestfulAuthentication < Base 

     def self.digest(password, stretches, salt, pepper) 
      digest = pepper 
      stretches.times do 
      digest = secure_digest(digest, salt, password, pepper) 
      end 
      digest 
     end 

     def self.secure_digest(*args) 
      Digest::SHA1.hexdigest(args.flatten.join('--')) 
     end 

     def self.encrypt_password 
      return if password.blank? 
      self.password_salt = make_token if new_record? 
      self.encrypted_password = encrypt(password) 
     end 

     def self.make_token 
      secure_digest(Time.now, (1..10).map{ rand.to_s }) 
     end 

     def self.encrypt(password) 
      self.password_digest(password, stretches, salt, pepper) 
     end 
     end 
    end 
    end 
end 
संबंधित मुद्दे