Thiết lập lại mật khẩu từ bảng điều khiển Rails


92

Trong khi chạy một ứng dụng, làm cách nào để bạn chọn một người dùng theo địa chỉ email và sau đó đặt mật khẩu theo cách thủ công rails consolecho Devise?

Ngoài ra, tôi sẽ đi đến đâu để xem lại tài liệu để trình bày thêm chi tiết về vấn đề thao túng tài khoản khi sử dụng Devise?


Valk: where () không khả dụng cho đến khi rails 3. Nhưng, cách bạn làm cũng ổn.
hellion

Câu trả lời:


138

Nó nhiều hơn hoặc ít hơn như bạn mô tả :-)

# use mongoid
class User
  include Mongoid::Document
end


# then
user = User.where(email: 'joe@example.com').first

if user
  user.password = new_password
  user.password_confirmation = new_password
  user.save
end

Cập nhật từ 6 năm sau :)

Phát triển hiện đại cho phép cú pháp đơn giản hơn, không cần đặt trường xác nhận

user.password = new_password; user.save
# or
user.update_attributes(password: new_password)

À, hmm. Điều đó sẽ hoạt động đối với người dùng tiêu chuẩn, nhưng trong trường hợp này, nó từ bảng admin_users. Tinh chỉnh thích hợp để lấy từ bảng này so với người dùng là gì? Đơn giản chỉ cần đặt nó thành user = AdminUser ... đã không hoạt động.
ylluminate

Umm, tôi không biết, truy vấn mô hình AdminUser? Đối với tôi, tôi luôn lưu trữ tất cả người dùng trong cùng một bảng, với thuộc tính 'vai trò' được gán.
Sergio Tishedsev

Bạn có thể thay đổi tên của bộ sưu tập mà mô hình tham chiếu đến bằng phương thức: store_in. Vì vậy, để tìm trong bảng admin_users, bạn phải thêm User.store_in 'admin_users' trước mã đó. (câu trả lời này ngụ ý sử dụng của Mongoid)
Sergio Tulentsev

Đã cố gắng User.store_in 'admin_users'tuy nhiên đã nhận được undefined method. Tôi dường như không thể truy cập vào bảng vì tôi chỉ nhận được con số không mỗi lần. Còn việc truy vấn toàn bộ bảng và chỉ lấy tất cả các mục trong đó ban đầu để kiểm tra xem liệu tôi có vào được bảng đó ban đầu không? (Làm việc trong MySQL ở đây, tuy nhiên điều đó không thành vấn đề với ActiveRecord.)
ylluminate vào

: store_in là một phần của đá quý Mongoid. Bạn có thể nhận được quyền truy cập vào thấp (er) tài xế ruby -level bằng cách gọi User.db
Sergio Tulentsev

55
# $ rails console production
u=User.where(:email => 'usermail@gmail.com').first
u.password='userpassword'
u.password_confirmation='userpassword'
u.save!

1
devise được nung trong đường ray nên việc sử dụng xác nhận pw là dư thừa. User.find_by_email('joe@example.com').update_attributes(:password => 'password')
copremesis

26

Nếu bạn chạy phần sau trong bảng điều khiển rails, nó sẽ thực hiện thủ thuật:

User.find_by(email: 'user_email_address').reset_password!('new_password','new_password')

http://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Recoverable


6
Lưu ý rằng dấu chấm than không được dùng nữa, nó chỉ là:User.find_by(email: 'user_email_address').reset_password('new_password','new_password')
IrishDubGuy

1
Cũng lưu ý rằng bạn phải nhập một mật khẩu hợp lệ xác nhận các yêu cầu mật khẩu trong cấu hình phát minh của bạn.
zwippie

5

Bạn có thể chỉ cần cập nhật trường mật khẩu, không cần mật khẩu xác nhận, devise sẽ lưu nó dưới dạng mã hóa

u = User.find_by_email('user@example.com')
u.update_attribute(:password, '123123')

3

Vì lý do nào đó, (Rails 2.3 ??)

user = User.where(:email => email).first

không hiệu quả với tôi, nhưng

user = User.find_by_email('user@example.com')

đã làm nó.


Lý do cho điều này là where (); phương pháp này vẫn chưa có trong rails 2.3, chúng tôi đã sử dụng tìm kiếm (: tất cả,: điều kiện => điều kiện) trước đây.
dennis

3

1.Đăng nhập vào bảng điều khiển ralis

$ sudo bundle exec rails console production

2. sau đó cập nhật mật khẩu của quản trị viên

irb(main):001:0> user = User.where("username = 'root'")
irb(main):002:0> u = user.first
irb(main):003:0> u.password="root2014@Robin"
=> "root2014@Robin"
irb(main):004:0> u.password_confirmation="root2014@Robin"
=> "root2014@Robin"
irb(main):005:0> u.save
=> true
irb(main):006:0> exit

3. làm mới trang đăng nhập, sử dụng mật khẩu mới để đăng nhập, tận hưởng!

Chúc may mắn!


devise được đưa vào vì vậy việc sử dụng xác nhận pw là dư thừa. User.find_by_email('joe@example.com').update_attributes(:password => 'password')
copremesis

2
User.find_by_email('joe@example.com').update_attributes(:password => 'password')

0

Nếu tài khoản của bạn bị khóa do quá nhiều lần đăng nhập, bạn cũng có thể cần thực hiện:

user.locked_at = ''
user.failed_attempts = '0'
user.save!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.