2009-03-19 28 views
5

Tôi có ứng dụng 2.2.3 mà tôi đã nâng cấp lên 2.3.2Mất phiên trong đường ray 2.3.2 ứng dụng sử dụng tên miền phụ

Đó là một trang web đa sử dụng tên miền cấp cao nhất cho tất cả các trang web.

Đây là cách tôi thay đổi tên miền trong production.rb:

ActionController::Base.session_options[:domain] = "example.com" 

# in rails 2.2.2, this is what i used to do: 
# ActionController::Base.session_options[:session_domain] = "example.com" 

Điều kỳ lạ bắt đầu xảy ra sau khi tôi nâng cấp tôi không còn có thể đăng nhập bằng xác thực yên tĩnh; nó xác thực tôi, nhưng ngay sau khi tôi được chuyển hướng, nó sẽ yêu cầu tôi đăng nhập lại.

Như tôi đã nói, tôi sử dụng tính năng xác thực và tôi cũng sử dụng hành khách 2.1.2. Có ai giúp được không?

+0

là câu trả lời của Vlad có đúng không? – MickaelFM

Trả lời

1

Bạn phải ghi rõ:

.example.com 

(chú ý dẫn chấm) để các cookie phiên để áp dụng cho example.com cũng như của tên miền phụ.

-1

Tôi gặp sự cố tương tự với phiên dựa trên cookie. Nâng cấp lên Hành khách 2.1.3 dường như khắc phục được vấn đề.

+0

đây là một vấn đề khác nhau –

0

chúng tôi đã gặp sự cố tương tự (mất phiên, không có tên miền phụ), với nginx + mỏng. Di chuyển sang apache + hành khách (phiên bản cuối cùng) đã khắc phục được sự cố.

3

Trong Rails 2.3 bạn nên sử dụng

config.action_controller.session[:domain] = '.example.com' 
+0

Tôi đã thử đặt điều này trong development.rb và nhận: phương thức chưa xác định '[] = 'cho nil: NilClass –

+0

Ahh! Tìm ra. Biến phiên chưa được tạo. Điều này làm việc: config.action_controller.session = {: domain => '.example.com'} –

7

câu trả lời Olly là đúng, trong đường ray 2.3 nó nên là:

config.action_controller.session[:domain] = '.example.com' 

Tôi chỉ muốn nói thêm rằng nếu bạn không đã có một số tùy chọn phiên được tạo, bạn có thể nhận được điều này khi sử dụng:

undefined method `[]=' for nil:NilClass 

Trong trường hợp đó bạn nên sử dụng nstead (tạo biến phiên thay vì cập nhật):

config.action_controller.session ||= {} 
config.action_controller.session[:domain] = '.example.com' 

Chỉnh sửa: rõ ràng Rails 2.2.2 dự án sử dụng thứ gì đó khác. "tên miền" phải được đặt tên là "session_domain" và lấy ký tự dấu chấm ở phía trước tên miền. Hãy thử điều này:

config.action_controller.session ||= {} 
config.action_controller.session[:session_domain] = 'example.com' 
+0

Tuyệt vời, đã nhận được lỗi chính xác và giờ đây có thể khắc phục: D – nitecoder

+0

Điều này rất hữu ích cho tôi để đặt các phiên bảo mật. – anonmys

1

Chỉ muốn đề cập đến cách khác để xử lý toàn bộ tên miền phụ cho cookie là động. Hoạt động trong 2.3.4.

Something như thế này trong environment.rb

# solution to use the cookies in the api. domains 
# this is relevant but in 2.3.4 the code is different 
# http://szeryf.wordpress.com/2008/01/21/cookie-handling-in-multi-domain-applications-in-ruby-on-rails/ 
# Just making sure that api. shares the domain name 
require 'dispatcher' 
module ActionController 
    class Dispatcher 
    def set_session_domain 
     host_name = @env['SERVER_NAME'] 
     new_host_name = whatever #some mod of the host_name, for instance 
     ActionController::Base.session = { 
     :domain => new_host_name 
     } 
    end 

    before_dispatch :set_session_domain 
    end 
end 
1

Tôi đang chạy Rails 2.3.5 và có

config.action_controller.session = {:domain => '.localhost:3000'} 

trong development.rb của tôi, nhưng tôi không làm cho nó làm việc ?

Bạn cần làm gì khác?

2

Một giải pháp chống đạn hơn sẽ là kiểm tra xem phiên đã tồn tại hay chưa. Nếu bạn đang thay thế một cách mù quáng đối tượng toàn bộ phiên, nó có thể khiến bạn phải đi lên trong tương lai.

if ActionController::Base.session 
    ActionController::Base.session[:domain] = '.example.com' 
else 
    ActionController::Base.session = { :domain => '.example.com' } 
end 

Tôi thích làm điều này trong tệp khởi tạo.

0

Tôi cũng đang chạy 2.3.5 và gặp phải vấn đề tương tự như @ alfred-nerstu

Không thông báo lỗi với các bản vá từ @schickm nhưng nó dường như không có, một trong hai.

0

Nó có thể được thêm vào trong cùng một vị trí nơi bạn thiết lập các session key và bí mật

config.action_controller.session = { 
     :key => '_app_session', 
     :domain => '.domain.com', 
     :secret => 'secret' 
} 
Các vấn đề liên quan