Как создать поддомен администратора для управления поддоменами в Rails
Я использую AuthLogic и метод поддоменов, который dhh описал в этом блоге, все работает отлично, и как и ожидалось. Я пытаюсь понять, как создать поддомен, такой как "admin" или "host", который будет иметь пользователя, аутентифицированного из AuthLogic (это может быть тривиально и не нужно упоминать), который будет управлять поддоменами. Таким образом, в основном, все поддомены будут действовать нормально, за исключением admin.site.com который пойдет на свой собственный контроллер и макет..
Dhh предложил просто добавить исключение для перенаправления, но я не уверен, куда это идет, мне это не казалось таким простым, есть идеи?
EDIT Я думаю, что тот факт, что я использую AuthLogic, важен здесь, потому что логика поддомена не перенаправляет пользователей куда - либо, после аутентификации AuthLogic отправляет пользователя в /account-поэтому мой вопрос может быть связан с тем, как я могу сказать AuthLogic в другое место, если пользователь является корневым пользователем, входящим в поддомен администратора..
Вот код, который мы реализовали до сих пор
Модель Компании
class Company < ActiveRecord::Base
has_many :users
has_many :brands, :dependent => :destroy
validates_presence_of :name, :phone, :subdomain
validates_format_of :subdomain, :with => /^[A-Za-z0-9-]+$/, :message => 'The subdomain can only contain alphanumeric characters and dashes.', :allow_blank => true
validates_uniqueness_of :subdomain, :case_sensitive => false
validates_exclusion_of :format, :in => %w( support blog billing help api www host admin manage ryan jeff allie), :message => "Subdomain {{value}} is not allowed."
before_validation :downcase_subdomain
protected
def downcase_subdomain
self.subdomain.downcase! if attribute_present?("subdomain")
end
end
Модуль Субдоменов
module SubdomainCompanies
def self.included( controller )
controller.helper_method(:company_domain, :company_subdomain, :company_url, :company_account, :default_company_subdomain, :default_company_url)
end
protected
# TODO: need to handle www as well
def default_company_subdomain
''
end
def company_url( company_subdomain = default_company_subdomain, use_ssl = request.ssl? )
http_protocol(use_ssl) + company_host(company_subdomain)
end
def company_host( subdomain )
company_host = ''
company_host << subdomain + '.'
company_host << company_domain
end
def company_domain
company_domain = ''
company_domain << request.domain + request.port_string
end
def company_subdomain
request.subdomains.first || ''
end
def default_company_url( use_ssl = request.ssl? )
http_protocol(use_ssl) + company_domain
end
def current_company
Company.find_by_subdomain(company_subdomain)
end
def http_protocol( use_ssl = request.ssl? )
(use_ssl ? "https://" : "http://")
end
end
Контроллер Приложения
class ApplicationController < ActionController::Base
include SubdomainCompanies
rescue_from 'Acl9::AccessDenied', :with => :access_denied
helper :all # include all helpers, all the time
protect_from_forgery # See ActionController::RequestForgeryProtection for details
helper_method :current_user_session, :current_user, :current_company_name
filter_parameter_logging :password, :password_confirmation
before_filter :check_company_status
protected
def public_site?
company_subdomain == default_company_subdomain
end
def current_layout_name
public_site? ? 'public' : 'login'
end
def check_company_status
unless company_subdomain == default_company_subdomain
# TODO: this is where we could check to see if the account is active as well (paid, etc...)
redirect_to default_company_url if current_company.nil?
end
end
end
2 ответа:
Посмотрите вподдомен-fu , который позволяет вам направлять к различным контроллерам и действиям, основанным на поддомене. Я сделал серию железнодорожных передач на эту тему.
Это может выглядеть примерно так.
# in routes.rb map.manage_companies '', :controller => 'companies', :action => 'index', :conditions => { :subdomain => "admin" }
Это должно быть достаточно высоко в списке маршрутов, чтобы ничто другое не было сопоставлено перед ним.
Для RAILS 2.3: Вы можете скачать полный пример приложения (с пошаговым руководством), показывающий, как реализовать поддомен администратора, основной домен и несколько пользовательских поддоменов, используя Gem Devise для аутентификации и gem subdomen-routes для управления поддоменами. Вот ссылка: аутентификация поддомена для Rails 2.3 .
Для RAILS 3: Вот полный пример реализации Rails 3 поддоменов с аутентификацией (наряду с подробным руководство). Это гораздо проще сделать в Rails 3, чем в Rails 2 (плагин не требуется).