11

嗨,我有一个多租户 rails 4 应用程序,它有一个简单的登录解决方案。但是,每个用户都有一个用户在登录后被重定向到的子域。

问题是当他们到达子域时,由于会话不跨子域共享的已知问题,他们不再登录。

我已经尝试了几种不同的解决方案来解决这个问题,但是我没有让会话在子域中持续存在。我相信这可能是由于我的开发环境?

我已经尝试了这个问题的所有答案: Share session (cookies) between subdomains in Rails?

似乎没有任何效果。我在这里缺少什么吗?是浏览器还是 rails 4 或....?我应该如何解决这个问题?

编辑: 我的 session_store 初始化程序:

Imagesite::Application.config.session_store :cookie_store, key: '_imagesite_session', :domain => "imagesite.dev"

我也试过".imagesite.dev":all

我还尝试了 Evan 在上面链接的另一个问题中描述的解决方案。

子域示例: “ole.imagesite.dev”或“ole2.imagesite.dev”只是基于用户作为他/她的子域输入的基本子域。

4

3 回答 3

15

我终于解决了!

创建 auth_token cookie 时,我必须设置域。像这样:

cookies[:auth_token] = { value: user.auth_token, domain: ".lvh.me" }

并像这样删除cookie:

cookies.delete(:auth_token, :domain => '.lvh.me')

完整示例:

  def create
    user = User.find_by_username(params[:username])
    user ||= User.find_by_email(params[:username])
    if user && user.authenticate(params[:password])
      # session[:user_id] = user.id
        if params[:remember_me]
        cookies.permanent[:auth_token] = { value: user.auth_token, domain: ".lvh.me" }
      else
        cookies[:auth_token] = { value: user.auth_token, domain: ".lvh.me" }
      end
        redirect_to root_url(:subdomain => "#{current_user.subdomain}"), notice: "You are now loged in."
    else
        flash.now.alert = "Email or password is invalid"
        render "new"
    end
  end

  def destroy
    #session[:user_id] = nil
    cookies.delete(:auth_token, :domain => '.lvh.me')
    redirect_to root_url(:subdomain => false), notice: "Loged out"
  end
于 2013-10-20T13:46:30.203 回答
5

使用 Rails 4.2.5.1,以下对我有用:

Rails.application.config.session_store :cookie_store, key: '_magic_session', tld_length: 2

是的,没有 domain: 选项。

更新:最好将domain:选项设置为:all.

Rails.application.config.session_store :cookie_store, key: '_magic_session', domain: :all, tld_length: 2

domain: "magic.com"如果env["HTTP_HOST"]在开发环境中或在代理后面持有 IP 地址,而不是域名,则可能必须如此。对于nginx,proxy_set_header HOST $host:$server_port;可以保留域名。

于 2016-03-16T03:11:49.550 回答
0

在会话初始化程序中手动设置域一直对我有用。你可以发布你的初始化程序吗?还有一些您尝试在其间移动的子域的示例?

于 2013-10-04T21:23:28.900 回答