2012-05-04 3 views
16

В моем приложении только администраторы могут создавать новые записи пользователя. Пользователь отправляет по электронной почте ссылку активации, в которой они устанавливают свой пароль.Как пропустить проверку has_secure_password

Я хотел бы использовать метод has_secure_passord (railscast):

class User < ActiveRecord::Base 
    has_secure_password 
    ... 
end 

прекрасно работает, но она автоматически проверяет наличие пароля переваривать ... поэтому, когда администратор создает запись в валидация неудачу. У меня есть способ пропустить только автоматически добавленную пароли password_digest, не пропуская остальные, которые я добавил?

ответ

11

я решил сделать свою собственную проверку подлинности. Следующее решение будет проверять пароли, но только при их установке. Это позволяет администраторам создавать пользователей без добавления пароля.

class User < ActiveRecord::Base 
    include BCrypt 

    attr_accessor :password, :password_confirmation 

    validates :password, length: (6..32), confirmation: true, if: :setting_password? 

    def password=(password) 
    @password = password 
    self.password_hash = Password.create(password) 
    end 

    def authenticate(password) 
    password.present? && password_hash.present? && Password.new(password_hash) == password 
    end 

private 

    def setting_password? 
    password || password_confirmation 
    end 

end 

Если кто-то отправляет ответ, который позволяет мне по-прежнему использовать метод has_secure_password, я принимаю его вместо этого.

+2

Эй просто хотел сказать спасибо, потому что этот фрагмент отлично работал для того, что мне нужно для социальной проверки подлинности. –

+0

Вдохновенный. Я использую небольшое изменение этого права сейчас, чтобы поддерживать несколько логинов, позволяя вести обычный вход в систему по электронной почте и паролю, а также без пароля аутентификации в facebook. bauce, скажем, я! – FireDragon

1

Невозможно пропустить проверку, но было бы достаточно написать собственную версию метода, позволяющую передать аргумент, чтобы определить, следует ли проверять наличие поля password_digest.

Просто введите ActiveModel так же, как в SecurePassword module (через ActiveSupport::Concern) и добавьте свой собственный пароль.

т.е.

module ActiveModel 
    module MySecurePassword 
    extend ActiveSupport::Concern 

    module ClassMethods 
     def my_has_secure_password(validate_password_digest=true) 
     # you custom logic 
     end 
    end 
    end 
end 
+0

Это может сработать. Чувствует себя нехорошо. Я надеюсь, что найду что-то более элегантное. – tybro0103

26

Начиная с версий 4.X рельсов, has_secure_password имеет возможность: проверки. Если вы установите его на false, оно не будет проверяться.

3.X версия драгоценного камня не поддерживает этот параметр. Однако вы можете заархивировать activemodel/lib/active_model/secure_password.rb от latest 4.0.XRC code, который поддерживает этот аргумент.

Так с этим, ваш код будет выглядеть следующим образом:

class User < ActiveRecord::Base 
    has_secure_password :validations => false 
    ... 
end 
Смежные вопросы