2013-02-02 21 views
5

Gems

ruby 1.9.3 
rails 3.2.11 
devise 2.2.3 
acts_as_tenant 0.2.9 

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.

Trả lời

3

cố định, trong application_controller, thay đổi

before_filter :set_tenant 

để

prepend_before_filter :set_tenant 

để default_scope tất cả mọi thứ, bao gồm cả tài khoản, trước khi lập mưu kiểm tra phiên làm việc của người dùng.

+0

Đ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ạ ... –

+0

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

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