2009-08-07 21 views
11

tôi thường muốn xóa các cửa hàng phiên trong Rails, đặc biệt là các cửa hàng phiên mặc định dựa trên cookie. Một số trang web dường như đề xuất rằngCommand để xóa các cửa hàng phiên dựa trên cookie trong Rails

rake tmp:sessions:clear 

hoàn thành nhiệm vụ này, nhưng có vẻ như nó không có. Cách thích hợp để xóa kho lưu trữ phiên dựa trên cookie là gì?

Trả lời

8

Vấn đề là cookie là phía khách hàng. Việc chạy tác vụ cào trên máy chủ của bạn sẽ không xóa cookie trên tất cả các máy đã truy cập vào trang web, hiển nhiên.

Có lẽ bạn có thể sử dụng session.clear trong bộ điều khiển của bạn bằng cách nào đó? Bạn đang đúng về việc thay đổi khóa cookie, mặc dù. Làm như vậy sẽ làm mất hiệu lực bất kỳ phiên nào thuộc về khóa cũ. Bạn sẽ phải giải cứu từ ActionController::StaleSession (hoặc một cái gì đó tương tự), nhưng nó sẽ hoạt động.

+2

Phải, như tôi đã nói trong nhận xét của mình, tôi bị ấn tượng sai lầm rằng cookie chỉ giữ một số mã thông báo phiên giữa máy khách và máy chủ và mã thông báo cũng được lưu trữ ở phía máy chủ để xác thực mã thông báo của khách hàng hoặc dữ liệu nằm ở phía máy chủ. Tạm thời tôi chỉ có một giải pháp thay thế trong mã của mình để bỏ qua phiên. Có lẽ điều đơn giản nhất là chuyển sang kho lưu trữ cookie được lưu trữ dữ liệu cho môi trường phát triển (tôi muốn xóa các phiên chỉ dành cho mục đích phát triển). – user85509

3

Nó xảy ra với tôi bây giờ rằng những gì tôi muốn có thể không thể tùy thuộc vào cách các cửa hàng dựa trên cookie được thực hiện. Nếu cookie chứa tất cả thông tin mà máy chủ cần (bao gồm chữ ký cho toàn vẹn dữ liệu) thì máy chủ không cần lưu trữ bất kỳ thông tin nào về phía nó do đó không có cách nào để vô hiệu hóa các cookie hiện có. Tôi đã giả định rằng cookie chứa một số khóa tương ứng với dữ liệu ở phía máy chủ để xác minh rằng cookie hợp lệ, nhưng bây giờ tôi nhận ra điều này có thể không đúng.

Nếu điều này là đúng, thì cách duy nhất để xóa các tập tin cookie sẽ được thay đổi bí mật Cookie server-side được sử dụng để ký kết và sau đó có lẽ khởi động lại quá trình máy chủ.

+0

Thay đổi config.secret_token và khởi động lại máy chủ. Phiên cookie đã được đặt lại. Kết quả. – patrickmcgraw

9

Thay đổi tên của cookie phiên. Nó sẽ không xóa các cookie cũ, nhưng nó sẽ buộc tất cả mọi người để có được một cookie phiên mới.

24

Nếu bạn sử dụng Cookie dựa phiên

Bạn có thể thay đổi secret_token của ứng dụng ray của bạn. Điều này sẽ làm mất hiệu lực tất cả các phiên hiện có.

rake secret 

Sau đó sao chép các giá trị trong để

RAILS_ROOT/config/initializers/session_store.rb 

Thats nó. Hãy nhớ khởi động lại ứng dụng của bạn sau này;)

Nếu bạn sử dụng cơ sở dữ liệu dựa trên phiên

rake db:sessions:clear 

Nếu bạn sử dụng tập tin dựa phiên

rake tmp:sessions:clear 
+4

Tôi phải sao chép giá trị vào secret_token.rb –

1

Nếu bạn đang chạy này trên máy chủ sản xuất Tôi khuyên bạn nên:

rake secret 

Cách đơn giản là tạo một mã thông báo an toàn ngẫu nhiên. Nhiệm vụ rake về cơ bản là làm điều này, mà bạn có thể làm trong một giao diện điều khiển.

SecureRandom.hex(64) 

Không bao giờ kiểm tra khóa sản xuất vào kiểm soát phiên bản/GIT nhưng sử dụng biến môi trường thay thế.Vì vậy, trong tập tin config/secrets.yml của bạn, hãy sử dụng một cái gì đó như:

production: 
    secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> 
Các vấn đề liên quan