2008-08-02 24 views
46

Ứng dụng Rails của tôi có hộp đăng nhập với hộp kiểm "nhớ thông tin đăng nhập của tôi". Người dùng kiểm tra hộp đó sẽ vẫn đăng nhập ngay cả sau khi đóng trình duyệt của họ. Tôi đang theo dõi xem liệu người dùng có đăng nhập hay không bằng cách lưu trữ id của họ trong phiên của người dùng.Thực hiện "Ghi nhớ tôi" trong ứng dụng Rails

Nhưng phiên được triển khai trong Rails dưới dạng cookie phiên, không liên tục. Tôi có thể làm họ dai dẳng:

class ApplicationController < ActionController::Base 
    before_filter :update_session_expiration_date 

    private 

    def update_session_expiration_date 
    options = ActionController::Base.session_options 
    unless options[:session_expires] 
     options[:session_expires] = 1.year.from_now 
    end 
    end 
end 

Nhưng điều đó có vẻ như một hack, mà là đáng ngạc nhiên cho các chức năng thông thường như vậy. Có cách nào tốt hơn không?

Sửa

câu trả lời Gareth là khá tốt, nhưng tôi sẽ vẫn giống như một câu trả lời từ một người quen thuộc với Rails 2 (vì nó là duy nhất CookieSessionStore).

Trả lời

10

Tôi đã dành một lúc suy nghĩ về điều này và đi đến một số kết luận. Cookie phiên Rails là giả mạo bằng chứng mặc định, vì vậy bạn thực sự không phải lo lắng về một cookie đang được sửa đổi trên đầu khách hàng.

Đây là những gì tôi đã thực hiện:

  • Cookie Session được thiết lập để được tồn tại lâu dài (6 tháng hoặc lâu hơn)
  • Bên trong cửa hàng phiên
    • Một 'hết hạn vào' ngày được đặt thành đăng nhập + 24 giờ
    • id người dùng
    • Authenticated = true vì vậy tôi có thể cho phép ẩn danh người dùng ẩn danh (không nguy hiểm vì cookie giả mạo protectio n)
  • Tôi thêm một before_filter trong Bộ điều khiển ứng dụng để kiểm tra phần 'hết hạn' trong phiên.

Khi người dùng chọn hộp "Nhớ tôi", tôi chỉ đặt phiên [: expireson] ngày đăng nhập + 2 tuần. Không ai có thể ăn cắp cookie và duy trì trạng thái đăng nhập vĩnh viễn hoặc giả mạo với tư cách người dùng khác vì cookie phiên rails là giả mạo.

+0

theo mặc định Các cookie phiên Rails chỉ là phiên trình duyệt và do đó cookie sẽ bị xóa khi đóng trình duyệt. Làm cách nào để bạn thực hiện bước một trong giải pháp của mình và bạn đang sử dụng phiên bản Rails nào? "Cookie phiên được đặt lâu dài (6 tháng hoặc lâu hơn)" – Nick

+1

Tôi đã thay đổi các giá trị mặc định để làm cho cookie phiên không phải là "chỉ phiên trình duyệt". Câu trả lời này được hình thành cách đây 4 năm và cấu hình/mặc định có thể không áp dụng cho các phiên bản Rails mới hơn. –

25

Bạn gần như chắc chắn sẽ không mở rộng cookie phiên để tồn tại lâu dài.

Mặc dù không giao dịch cụ thể với đường ray this article có độ dài nào đó để giải thích các phương pháp hay nhất 'nhớ đến tôi'.

Nói tóm lại dù bạn nên:

  • Thêm một cột bổ sung cho các bảng người dùng phải chấp nhận một giá trị ngẫu nhiên lớn
  • Đặt một cookie tồn tại lâu dài trên máy khách kết hợp id người dùng và các giá trị ngẫu nhiên
  • Khi phiên mới bắt đầu, hãy kiểm tra sự tồn tại của cookie id/value và xác thực người dùng mới nếu chúng khớp nhau.

Tác giả cũng khuyên bạn nên vô hiệu hóa giá trị ngẫu nhiên và đặt lại cookie ở mọi thông tin đăng nhập. Cá nhân tôi không thích điều đó vì bạn không thể đăng nhập vào một trang web trên hai máy tính. Tôi sẽ có xu hướng đảm bảo rằng chức năng thay đổi mật khẩu của tôi cũng đặt lại giá trị ngẫu nhiên, do đó khóa các phiên trên các máy khác. Là một lưu ý cuối cùng, lời khuyên mà anh đưa ra khi thực hiện các chức năng nhất định (thay đổi mật khẩu/thay đổi email, v.v.) không có sẵn cho các phiên được xác thực tự động cũng đáng để theo dõi nhưng hiếm thấy trong thế giới thực.

+3

Hãy xem xét cải tiến bài viết được đề xuất tại http://jaspan.com/improved_persistent_login_cookie_best_practice để thêm khái niệm "chuỗi" để bảo mật tốt hơn. Ngoài ra mô tả của bạn không chính xác: 1) tác giả bài viết của bạn đề xuất một bảng ánh xạ một-nhiều giữa người dùng và cookie để tránh liên tục làm mất hiệu lực đăng nhập của bạn khi chuyển máy tính (i.e làm việc và nhà) 2) việc vô hiệu hóa cookie ngẫu nhiên sẽ không gây ra những gì bạn mô tả (hai vấn đề máy tính) – cherouvim

+1

Câu trả lời này là gây hiểu nhầm. Các phiên liên tục được bảo mật vì các cookie đã ký do Rails cung cấp được bảo mật. Chỉ có một lý do để sử dụng phương pháp được đề xuất trong câu trả lời này, đó là "lưu ý cuối cùng": phương pháp này hữu ích để phân biệt giữa xác thực thủ công và tự động (thông qua "nhớ tôi"). – collimarco

+0

Tôi đã đưa ra một giải pháp dựa trên điều này. Thay vì dựa vào một cột mới, thay vào đó tôi sử dụng 'Digest :: SHA512.base64digest (user.password_digest)' làm mã thông báo của mình. 'password_digest' đã là giá trị được bảo vệ, nhưng SHA512 sẽ bảo vệ nó nhiều hơn. Sau đó, tôi lưu trữ user_id trong phiên làm việc ở phía máy chủ, do đó tôi chỉ phải tính SHA512 một lần mỗi phiên. Điều này sẽ bị vô hiệu khi mật khẩu được thay đổi. – bradlis7

3

Lưu ý rằng bạn không muốn kiên trì phiên họp của họ , chỉ là danh tính của họ. Bạn sẽ tạo một phiên mới cho họ khi họ quay lại trang web của bạn. Nói chung, bạn chỉ cần gán GUID cho người dùng, viết nó vào cookie của họ, sau đó sử dụng nó để tìm kiếm chúng khi họ quay trở lại. Không sử dụng tên đăng nhập hoặc ID người dùng của họ cho mã thông báo vì nó có thể dễ dàng được đoán và cho phép khách truy cập xảo quyệt chiếm đoạt tài khoản của người dùng khác.

9

Tôi khuyên bạn nên xem xét trình cắm RESTful_Authentication, trong đó có triển khai thực hiện việc này hoặc chỉ chuyển đổi triển khai của bạn để sử dụng RESTful Authentication_plugin. Có một lời giải thích tốt về cách sử dụng này cắm tại Railscasts:

railscasts #67 restful_authentication

Dưới đây là một liên kết đến các plugin tự

restful_authentication

2

này làm việc như một nét duyên dáng cho tôi:

http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/

Bây giờ các phiên CookieStore của tôi hết hạn sau hai tuần, theo đó người dùng phải gửi lại thông tin xác thực đăng nhập của họ để được đăng nhập liên tục trong hai tuần nữa.

Bascially, nó đơn giản như:

  1. bao gồm một tập tin trong vendor/plugins
  2. bộ phiên giá trị hết hạn trong điều khiển ứng dụng sử dụng chỉ là một dòng
3

tôi sẽ đi cho lập mưu cho một giải pháp xác thực tuyệt vời cho đường ray.

Các vấn đề liên quan