2013-06-06 20 views
8

Tôi có ứng dụng 4 đường ray mà tôi đang sử dụng để xác thực và nó hoạt động hoàn hảo. Vấn đề duy nhất của tôi là nó mất phiên của người dùng sau khi tôi triển khai nó trên máy chủ và người dùng phải đăng nhập lại.Devise mất phiên sau khi triển khai

Nếu tôi chỉ khởi động lại nginx/hành khách (mà tôi đang sử dụng cho ứng dụng của mình) thì nó sẽ không bị mất. Khi tôi triển khai ứng dụng của mình, tôi sẽ mất nó. Để triển khai, tôi cũng tự động xóa tất cả cơ sở dữ liệu và tập lệnh triển khai của tôi chạy tệp hạt giống mà nó cũng tạo ra người dùng.

Hiện tại chúng tôi đang phát triển ứng dụng để loại hành vi này có thể chấp nhận được nhưng trong tương lai khi ứng dụng sẽ sẵn sàng, chúng tôi sẽ không thực hiện theo cách này (tất nhiên!).

Vì vậy, đây có phải là vấn đề do việc chèn lại hoặc tôi nên kiểm tra điều gì khác? Tôi thấy rằng mật khẩu được mã hóa thay đổi mỗi khi tôi chạy hành động xóa/hạt giống, điều này có liên quan đến việc mất phiên người dùng không?

Trả lời

4

Lý do của hành vi này là như sau:

Mỗi khi một số người dùng thay đổi mật khẩu của mình, tự động tạo ra signs_out anh ta. Vì vậy, về cơ bản bằng cách chèn lại dữ liệu, mật khẩu được tính toán lại (mặc dù mật khẩu là như nhau, mật khẩu được mã hóa mới khác với mật khẩu cũ). Về cơ bản, mật khẩu đã được tính toán lại. Vì vậy, việc đưa ra sẽ tự động sign_out người sử dụng, bởi vì nó có vẻ như mật khẩu được thay đổi (dựa trên các lĩnh vực encrypted_password khác nhau).

Tôi đã quản lý để bỏ qua hành vi này, bằng cách đặc biệt thiết lập encrypted_password trong tệp seed.rb và bỏ qua xác thực.

7

Bạn không bao giờ nên xóa sạch cơ sở dữ liệu trong khi triển khai. Hãy tưởng tượng rằng ứng dụng của bạn đang chạy và bạn có hàng trăm người dùng. Bây giờ bạn thực hiện một số thay đổi trong mã và thực hiện triển khai. POOF tất cả dữ liệu và người dùng của bạn đã biến mất! Chắc chắn đây không phải là những gì bạn muốn.

Thứ hai, người dùng bị đăng xuất khi bạn quét sạch cơ sở dữ liệu có thể là do một trong những lý do sau:

người dùng
  • Bạn đang gieo hạt với cùng một ID? Nếu ID người dùng thay đổi khi bạn đặt lại, nó sẽ khiến người dùng bị đăng xuất

  • Bạn có đang lưu các phiên trong cơ sở dữ liệu bằng cách sử dụng config.session_store :active_record_store thay vì sử dụng cookie không? Trong trường hợp này, xóa cơ sở dữ liệu sẽ xóa bảng phiên và đăng xuất tất cả người dùng

  • Rails 4 sử dụng kho lưu trữ cookie được mã hóa theo mặc định. Làm cho bạn chắc chắn bạn không thay đổi ứng dụng của bạn config.secret_token khi tái triển khai, trong trường hợp của mình nhận được nạp từ cơ sở dữ liệu

Cuối cùng, lau ra cơ sở dữ liệu là lý do duy nhất lý do tại sao người dùng đang làm đăng xuất, và đó là một thực hành tồi. Vì vậy, điều quan trọng nhất cần sửa là không xóa dữ liệu trong quá trình triển khai.

+0

Ứng dụng của chúng tôi đang được phát triển, khi nó sẽ được sản xuất, chúng tôi sẽ không làm như thế này, chúng tôi sẽ chỉ thêm di chuyển (tôi đã viết nó trong tin nhắn của tôi). Chúng tôi đang thay đổi/thử nghiệm quá nhiều vì vậy nó là cần thiết trong giai đoạn đầu này. Id của người dùng được xác định cụ thể trong hạt giống để người dùng có cùng một id mỗi khi chúng tôi đang nhập lại cơ sở dữ liệu. Chúng tôi không thay đổi secret_token và chúng tôi đang sử dụng mặc định của sự ra đời. Vậy tại sao điều này xảy ra? – JohnDel

+0

@JohnDel còn hai đề xuất khác thì sao? bảng phiên và ID người dùng? – Subhas

+0

Chúng tôi đang sử dụng: cookie_store dưới dạng session_store (bên trong trình khởi tạo) và người dùng có cùng id trước và sau khi xóa/chèn lại. – JohnDel

2

Nếu tôi chỉ khởi động lại nginx/hành khách (mà tôi đang sử dụng cho ứng dụng của mình), nó sẽ không bị mất. Khi tôi triển khai ứng dụng của mình, tôi sẽ mất nó. Để triển khai, tôi cũng tự động xóa toàn bộ cơ sở dữ liệu và tập lệnh triển khai chạy tệp hạt giống mà nó cũng tạo ra người dùng .

Nếu bạn tạo người dùng mới, người cũ sẽ mất phiên của họ.

Điều này là do giá trị của người dùng mới sẽ khác. Ví dụ: họ có thể không có bộ mã thông báo ghi nhớ hoặc nếu session_id sử dụng các giá trị của user.created_at hoặc user.token_generated_at, chúng sẽ khác nhau mỗi khi bạn thả và tạo lại cơ sở dữ liệu của mình.

+0

"Nếu bạn tạo người dùng mới, những người cũ sẽ mất các phiên của họ". Tại sao? Không phải các phiên được lưu trữ trong trình duyệt? Tôi không lưu trữ chúng trong cơ sở dữ liệu. – JohnDel

+0

Phiên là người dùng cụ thể. Nếu bạn tạo một người dùng mới, nó sẽ là một người dùng khác nhau thậm chí khó khăn địa chỉ email có thể giống nhau. –

+0

Tất cả các hàng của người dùng đều giống nhau (id, email, v.v.). Điều duy nhất mà thay đổi trong cơ sở dữ liệu là mật khẩu được mã hóa được lưu trữ (mặc dù tôi đang sử dụng cùng một mật khẩu, nhưng nó sẽ mã hóa nó trong một chuỗi mới). Tại sao? Tôi đang lưu phiên trong cookie. – JohnDel