ruby-on-rails - 设计 - 在子域上登录

标签 ruby-on-rails devise ruby-on-rails-3.2 subdomain

我在具有多个子域和多个模式的 rails 应用程序中使用设计 gem。

每个子域都由 Controller 处理,在 application_controller.rb 上看起来像这样:

def load_subdomain
    @account = Account.find_by_subdomain!(request.subdomain)
end

def after_sign_in_path_for(resource)
    #admin login in domain
    if resource.is_a?(admin) 
      admin_path
    #user login in subdomain
    elsif resource.is_a?(user)
      subdomain_root_path
    else
      super
    end    
  end

在routes.rb上
    match '/' => 'subdomains#index', :constraints => { :subdomain => /.+/ }, :as => :subdomain_root

devise_for :users, :skip => [:sessions, :registrations]

  devise_scope :user do
    get '/login/user' => 'sesusers#new', :as => :new_session_user
    post '/signin/user' => 'sesusers#create', :as => :user_session
    delete '/logout/user' => 'sesusers#destroy', :as => :destroy_user_session
    post '/send/user' => 'passwordusers#create', :as => :passwordusers_create
    get '/change_password/user' => 'passwordusers#edit', :as => :passwordusers_edit
    put '/change/user' =>  'passwordusers#update', :as => :passwordusers_update
  end

这导致每个子域有多个 sign_in url。
subdomain1.lvh.me:3000/login/user
subdomain2.lvh.me:3000/login/user
subdomain3.lvh.me:3000/login/user
...
...
etc

在 sesusers_controller.rb 上
class SesusersController < Devise::SessionsController
  include Tenantable::Schema::Controller
  before_filter :load_subdomain

  def new
    super
  end

  def create
    logger.info "Logged in"
    super
  end

  def destroy
    logger.info "Logout success"
    super
  end
end

当我尝试登录时,成功登录并重定向到 subdomain_root_path
Started POST "/signin/user" for 127.0.0.1 at 2013-04-08 20:36:04 +0700
Processing by SesusersController#create as HTML
  Parameters: {"utf8"=>"Γ£ô", "authenticity_token"=>"DJ/MJnHU5pHwxQQYDSvwyBsawmx
/9Ms7CXx3me0MBBE=", "user"=>{"email"=>"demouser@domain.com", "password"=>"
[FILTERED]", "remember_me"=>"0"}, "commit"=>"Login"}
  Account Load (2.0ms)  SELECT "public"."accounts".* FROM "public"."accounts" WH
ERE "public"."accounts"."subdomain" = 'subdomain1' LIMIT 1
Logged in
  User Load (2.0ms)  SELECT "users".* FROM "users" WHERE "users"."email" = 'demouser@domain.com' LIMIT 1
   (2.0ms)  BEGIN
   (53.0ms)  UPDATE "users" SET "last_sign_in_at" = '2013-04-08 12:55:28.631212'
, "current_sign_in_at" = '2013-04-08 13:36:04.615889', "sign_in_count" = 4 WHERE
 "users"."id" = 16
   (7.0ms)  COMMIT
Redirected to http://subdomain1.lvh.me:3000/
Completed 302 Found in 1589ms (ActiveRecord: 0.0ms)


Started GET "/" for 127.0.0.1 at 2013-04-08 20:36:06 +0700
Processing by SubdomainsController#index as HTML
  Account Load (2.0ms)  SELECT "public"."accounts".* FROM "public"."accounts" WH
ERE "public"."accounts"."subdomain" = 'subdomain1' LIMIT 1
  CACHE (0.0ms)  SELECT "public"."accounts".* FROM "public"."accounts" WHERE "pu
blic"."accounts"."subdomain" = 'subdomain1' LIMIT 1
   (30.0ms)  select sum(pg_total_relation_size(table_schema || '.' || table_name
)) from information_schema.tables where table_schema in ('subdomain') group by tab
le_schema
  Rendered subdomains/index.html.erb within layouts/subdomain (81.0ms)
Completed 200 OK in 170ms (Views: 130.0ms | ActiveRecord: 33.0ms) 

看,登录成功.. 查看子域
<div class="pull-right">
     <div class="btn-group">
         <% if user_signed_in? %>
            <%= link_to current_user.name, '#', { :class => 'btn btn-danger dropdown-toggle', 'data-toggle' => 'dropdown' } %>
                <ul class="dropdown-menu">
                  <li> <%= link_to "Dashboard", '#', 'style' =>"color:#fff" %></li>
                </ul>
         <% else %>
            <%= link_to ('<i class="icon-lock icon-white"></i>').html_safe + " Login" +(' <span class="caret"></span>').html_safe , '#', { :class => 'btn btn-danger dropdown-toggle', 'data-toggle' => 'dropdown' } %>
                <ul class="dropdown-menu">
                   <li><%= link_to "User", new_session_user_path, 'style' =>"color:#000" %></li>

                </ul>
         <% end %>
    </div>
</div>

但在查看子域 current_user.name不显示,只出现登录按钮。

有人能帮我吗?

谢谢/

最佳答案

为此,您只需要在子域之间共享用户 session ,以便多个子域可以继续一个 session 。

您应该修改 session_store.rb文件初始化为,

  DemoApp::Application.config.session_store :cookie_store, key: '_jcrop_app_session', domain: ".maindomain.com"

添加域将工作并小心使用子域所需的最后一个前导“ . ”(句点)。

关于ruby-on-rails - 设计 - 在子域上登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15880818/

相关文章:

ruby-on-rails - 如果特定电子邮件(空白电子邮件)已存在,如何允许设计保存用户?

ruby-on-rails - 在 Rails 中使用演示者

ruby-on-rails - 使用 has_secure_password 进行 Rails 身份验证

ruby - 在 Rails Engine 中使用 Ability 类

javascript - webpack如何加载 `bundle`安装的包?

ruby-on-rails - 设计安装后,找不到表 'users'

ruby-on-rails - 如何使用 rspec 在设计中测试 json 登录

ruby-on-rails - Heroku pgbackups :restore rebuild the database or just repopulate it?

ruby-on-rails - 使用 Apartment gem 为新模式播种数据?

ruby-on-rails - 避免 current_user 每次都点击数据库? ruby on Rails