Gems
ruby 1.9.3
rails 3.2.11
devise 2.2.3
acts_as_tenant 0.2.9
Mã
Tất cả các mô hình của tôi được scoped bởi một domain_id:Multitenancy (acts_as_tenant) với lập mưu (người dùng mặc định scoped bởi subdomain) phá vỡ buổi
class User < ActiveRecord::Base
acts_as_tenant(:domain)
#...
end
Sau đó, trong application_controller của tôi, tôi đặt đối tượng thuê hiện tại từ miền:
class ApplicationController < ActionController::Base
set_current_tenant_through_filter
before_filter :set_tenant
protect_from_forgery
#...
def set_tenant
#...
@domain = Domain.find_or_create_by_name(request.host)
set_current_tenant(@domain)
end
end
Tất cả hoạt động tốt cho tất cả các kiểu trừ phiên: Mỗi khi trang được tải, nó sẽ đăng xuất người dùng đầu tiên tải trang có người thuê khác. Bằng cách tải trang này, nó sẽ đăng xuất người dùng đầu tiên [... vv]
Giả thuyết: khi Alice truy cập miền, Rails tải current_tenant = alice_domain (ok). Tất cả hoạt động như mong đợi, cho đến khi Bob truy cập một tên miền khác, tải current_tenant = bob_domain. Khi Alice làm mới trang của mình, Rails vẫn có current_tenant == bob_domain. Rails kiểm tra phiên: Alice không tồn tại với phạm vi bob_domain, do đó Devise buộc Alice đăng xuất. Sau đó application_controller đặt current_tenant = alice_domain ... mà Bob đăng xuất.
Cách giải quyết khác: không sử dụng behavior_as_tenant trong mô hình người dùng, phạm vi người dùng theo miền trong mọi bộ điều khiển, sau đó ghi đè lên đăng nhập phạm vi và đăng ký theo miền. Và tôi không chắc chắn làm thế nào để có được Devise nhận thức của tên miền hiện tại trong các công cụ phiên. Nhân tiện, thay thế behavior_as_tenant bằng default_scope thủ công trong người dùng rơi vào cùng một lỗi lạ. Nó có vẻ rất bẩn để đi theo cách này.
Tôi đang tìm một giải pháp sạch trong nhiều ngày. Tôi sẽ rất biết ơn vì sự giúp đỡ nào.
Điều này không hoạt động đối với tôi trên/người dùng/chỉnh sửa tuyến đường vì một số lý do lạ ... –
Có vẻ quan trọng là không sử dụng 'current_user' trước khi sử dụng' set_current_tenant'. Nó có thể phụ thuộc vào máy chủ của bạn. Tôi đang sử dụng mỏng, nó cũng làm việc với webrick. – Habax