I am using devise gem in a rails application with multiple subdomains and multiple schema.
Each subdomain is handled by controller, which look like this on 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
on 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
This leads to having multiple sign_in urls for each sub-domains.
subdomain1.lvh.me:3000/login/user
subdomain2.lvh.me:3000/login/user
subdomain3.lvh.me:3000/login/user
...
...
etc
on 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
When I try login, success login and redirect to 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"=>"[email protected]", "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" = '[email protected]' 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)
look, successful login.. view subdomain
<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>
But on view subdomain current_user.name
not display, appears only login button.
can someone help me?
thanks/
You just need to share the user session between the subdomain for this, so that one session can be continued with multiple subdomains.
You should modify the session_store.rb
file in initializes as,
DemoApp::Application.config.session_store :cookie_store, key: '_jcrop_app_session', domain: ".maindomain.com"
Adding the domain will work and careful with the last leading "." (period) which is needed for sub domain.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With