2012-05-04 35 views
16

Trong ứng dụng của tôi, chỉ quản trị viên mới có thể tạo Hồ sơ người dùng mới. Người dùng được gửi qua email một liên kết kích hoạt nơi họ đặt mật khẩu của họ.Cách bỏ qua xác nhận has_secure_password

Tôi muốn sử dụng phương pháp has_secure_passord (railscast):

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

Các công trình lớn, nhưng nó tự động xác nhận sự hiện diện của mật khẩu tiêu hóa ... nên khi các quản trị viên tạo các bản ghi kiểm chứng thực thất bại. Tôi có một cách để bỏ qua chỉ tự động thêm password_digest xác nhận mà không bỏ qua những người khác tôi đã thêm?

Trả lời

11

tôi quyết định làm xác thực tùy chỉnh của riêng tôi. Giải pháp sau đây sẽ xác thực mật khẩu nhưng chỉ khi chúng được thiết lập. Điều này cho phép quản trị viên tạo người dùng mà không cần thêm mật khẩu.

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 

Nếu ai đó đăng câu trả lời cho phép tôi vẫn sử dụng phương pháp has_secure_password, tôi sẽ chấp nhận thay thế.

+2

Hey chỉ muốn nói lời cảm ơn vì đoạn mã này hoạt động hoàn hảo cho những gì tôi cần để xác thực xã hội –

+0

Cảm hứng, tôi đang sử dụng một biến thể nhỏ này ngay bây giờ để hỗ trợ đăng nhập nhiều lần, cho phép đăng nhập email/mật khẩu bình thường cũng như mật khẩu xác thực facebook. bauce, nói tôi! – FireDragon

1

Không có cách nào để bỏ qua xác thực, nhưng sẽ đủ dễ dàng để viết phiên bản của phương thức cho phép bạn chuyển đối số để xác định có hay không xác thực sự hiện diện của trường password_digest.

Chỉ cần mở rộng ActiveModel giống như cách họ thực hiện trong SecurePassword module (qua ActiveSupport::Concern) và thêm phương thức mật khẩu an toàn của riêng bạn.

ví dụ:

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

Điều đó có thể làm việc. Cảm thấy kinda sai mặc dù. Tôi hy vọng tôi sẽ tìm thấy một cái gì đó thanh lịch hơn. – tybro0103

26

Kể từ phiên bản 4.X của đường ray, has_secure_password có một tùy chọn: xác thực. Nếu bạn đặt thành false, nó sẽ không chạy xác thực.

Phiên bản 3.X của đá quý không hỗ trợ thông số này. Tuy nhiên bạn có thể backport activemodel/lib/active_model/secure_password.rb từ latest 4.0.XRC code hỗ trợ đối số này.

Vì vậy, với điều đó, mã của bạn sẽ trông như thế này:

class User < ActiveRecord::Base 
    has_secure_password :validations => false 
    ... 
end 
Các vấn đề liên quan