1

我想先重定向用户,然后以编程方式登录用户。

我有一个 multi-tanancy 应用程序,当用户尝试在根域登录时,我的应用程序不仅应该将用户重定向到他的子域,还应该让用户登录。

到目前为止,我正在尝试通过以下代码来完成此操作:

# In sessions#create ( Root )
redirect_to "http://#{account.subdomain}.localhost.com:3000/users/sign_in"
Apartment::Tenant.switch(account.subdomain)
sign_in(:user, account.owner) # Basically, owner is the user here.

当我运行代码时,它成功地重定向到子域,但没有让用户登录。

我收到以下错误:

Completed 302 Found in 93ms (ActiveRecord: 39.7ms)

此外,它不会切换schemawhen I do Apartment::Tenant.switch(account.subdomain),因为在运行Apartment::Tenant.switch(account.subdomain)when I run之后user = User.first,可以在日志中看到的查询是:

  User Load (0.9ms)  SELECT  "public"."users".* FROM "public"."users"   ORDER BY "public"."users"."id" ASC LIMIT 1

这里,public对应的schema是根域,而不是schema子域。

4

1 回答 1

0

大量搜索后的(唯一)解决方案是修改以下行config/initializers/session_store.rb

Rails.application.config.session_store :cookie_store, key: '_examples_session', :domain => :all

好吧,这无论如何都不是一个完美的解决方案,它会完成这项工作。它究竟做了什么实际上是通过所有子域维护一个会话

例如,如果我在 登录bugs.example.com,我的会话也将在这些子域中工作attendance.example.com并且喜欢这些子域。

我还写了一个before_action检查用户尝试登录的子域是否属于该用户,如果是,我让用户登录,如果不是,我将用户重定向到他所属的子域,并且如果用户不属于任何人,我会将他重定向到根 url。同样,通过 one session,用户将能够登录那里的每个子域,因此这种检查非常重要。

于 2015-03-30T11:40:02.030 回答