首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails 5,公寓和设计:带子域的登录不起作用

Rails 5,公寓和设计:带子域的登录不起作用
EN

Stack Overflow用户
提问于 2017-02-26 11:14:10
回答 2查看 3.6K关注 0票数 6

我使用公寓 (1.2.0)和设计,设计 (4.2.0)设置了Rails 5应用程序。由于一些DDNS问题,有一个限制,即应用程序只能在app.myapp.com下访问(注意子域app)。myapp.com重定向到app.myapp.com

我的用例是,注册到应用程序的每个用户(租户)都应该通过他们的子域(例如tenant.myapp.com)访问他们的特定数据。不应将用户的作用域限定在其子域中。基本上,应该可以从任何子域登录。重定向到租户的正确子域由ApplicationController处理。按照设计标准,登录页面可以在app.myapp.com/users/sign_in上找到。问题就是从这里开始的:

由于“电子邮件或密码不正确”错误,用户无法登录。

在发展过程中,我玩了一会儿。从lvh.me登录非常好。用户将被登录并重定向到他们的子域。对app.lvh.me进行同样的尝试会导致前面提到的问题。

我已经将会话存储设置为:

代码语言:javascript
运行
复制
# /config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, key: '_myapp_session', domain: {
  production:   '.app.myapp.com',
  staging:      '.app.myapp.com',
  development:  '.app.lvh.me'
}.fetch(Rails.env.to_sym, :all)

我也尝试过不起作用的折叠:

代码语言:javascript
运行
复制
Rails.application.config.session_store :cookie_store, key: '_myapp_session', domain: :all

,我需要做什么才能从任何子域登录?

一个测试用例是:

用户user1访问url app.myapp.com/users/sign_in,提供他们的凭据,并为此登录并重定向到user1.myapp.com

奖励:user1访问url another_user.myapp.com/users/sign_in,提供它们的凭据,并为此签名并重定向到user1.myapp.com

编辑

其他相关组合:

代码语言:javascript
运行
复制
# /config/initializers/apartment.rb
config.excluded_models = %w{ User }
config.tenant_names = lambda { User.pluck :subdomain }
config.tld_length = 2
Rails.application.config.middleware.insert_before Warden::Manager, Apartment::Elevators::FirstSubdomain
Apartment::Elevators::FirstSubdomain.excluded_subdomains = ExcludedSubdomains.subdomains

代码语言:javascript
运行
复制
# /app/classes/excluded_subdomains.rb
class ExcludedSubdomains
  def self.subdomains
    %w( www admin test public private staging app web net )
  end # subdomains
end # class

代码语言:javascript
运行
复制
# /app/models/user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :lockable

  after_create :create_tenant
  after_destroy :delete_tenant

  # other stuff
  def create_tenant
    Apartment::Tenant.create(subdomain)
  end # create_tenant


  def delete_tenant
    Apartment::Tenant.drop(subdomain)
  end # delete_tenant
end # class

代码语言:javascript
运行
复制
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :authenticate_user!
  before_action :redirect_to_subdomain

  private
  def redirect_to_subdomain
    return if self.is_a?(DeviseController) || self.is_a?(Users::OnboardingController)

    if current_user.present? && request.subdomain != current_user.subdomain
      redirect_to main_index_url(subdomain: current_user.subdomain)
    end # if
  end # redirect_to_subdomain

  def after_sign_in_path_for(resource_or_scope)
    users_onboarding_start_url(subdomain: resource_or_scope.subdomain)
  end # after_sign_in_path_for

  def after_sign_out_path_for(resource_or_scope)
    successful_logout_url(subdomain: '')
  end # after_sign_out_path_for
end # class
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-27 16:39:32

我发现问题了!与其在应用程序域前加上.app,该域不应该有子域,而应该有一个点。就像这样:

代码语言:javascript
运行
复制
# /config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, key: '_myapp_session', domain: {
  production:   '.myapp.com',
  staging:      '.myapp.com',
  development:  '.lvh.me'
}.fetch(Rails.env.to_sym, :all)

我很难找到这个简单的错误,我甚至创建了一个示例应用程序。由于这个例子已经存在,我想我可以分享它。它可以在GitHub找到。

票数 10
EN

Stack Overflow用户

发布于 2017-02-26 11:38:46

可以将apartment配置为从多租户中排除某些模型。

代码语言:javascript
运行
复制
config.excluded_models = ["User"]

上述指令允许您在所有租户之间维护公共用户。

如何将用户范围调整到特定的租户,并将其重定向到正确的子域,需要在设计模型和控制器方面进行一些重新设计。您可以考虑将其他列(如subdomaintenant_name )添加到User模型中,以便关联到特定的客户端,并增强/扩展devise控制器以正确地注册、登录和重定向用户。

不要使用session_store.rb中的当前条目,而是尝试在session_store.rb中添加以下行,将.testdomain.com替换为您的域名。

代码语言:javascript
运行
复制
Rails.application.config.session_store :cookie_store, key: '_jcrop_app_session', domain: ".testdomain.com"

尽管我使用任何子域(如myapp1app )成功登录,但我没有尝试代码的重定向部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42467757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档