Как создать административный поддомен для управления поддоменами в Rails - PullRequest
3 голосов
/ 19 февраля 2010

Я использую AuthLogic и метод поддоменов, который dhh описал в этом сообщении в блоге , все работает отлично, и, как и ожидалось. Я пытаюсь выяснить, как создать поддомен, такой как «admin» или «host», в котором пользователь будет аутентифицирован из AuthLogic (это может быть тривиально и не нужно упоминать), который будет управлять поддоменами. Таким образом, в основном все поддомены будут работать нормально, кроме admin.site.com, который перейдет на свой собственный контроллер и макет.

Дхх предложил просто добавить исключение для перенаправления, но я не уверен, к чему это приведет, мне не кажется, что это просто, какие-то идеи?

EDIT Я думаю, что тот факт, что я использую AuthLogic, важен здесь, потому что логика поддоменов не перенаправляет пользователей куда-либо, после аутентификации AuthLogic отправляет пользователя в / account - поэтому мой вопрос может быть связан с тем, как мне сообщить AuthLogic в другое место, если пользователь является пользователем root, входя в поддомен администратора ..

Вот код, который мы реализовали до сих пор

Модель компании

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 ]

4 голосов
/ 19 февраля 2010

Просмотрите subdomain-fu , который позволяет вам маршрутизировать к различным контроллерам и действиям, основанным на поддомене.Я сделал Эпизод Railscasts на эту тему.

Это может выглядеть примерно так.

# in routes.rb
map.manage_companies '', :controller => 'companies', :action => 'index', :conditions => { :subdomain => "admin" }

Это должно быть достаточно высоко в списке маршрутовтак что больше ничего не найдено до него.

3 голосов
/ 27 февраля 2010

ДЛЯ RAILS 2.3: Вы можете загрузить полный пример приложения (с пошаговым руководством), показывающий, как реализовать поддомен администратора, основной домен и несколько поддоменов пользователей с помощью гема Devise для аутентификации и гем поддоменов-маршрутов для управления поддоменами. Вот ссылка: аутентификация поддоменов для Rails 2.3 .

ДЛЯ RAILS 3: Вот полный пример реализации Rails 3 поддоменов с аутентификацией (вместе с подробным руководством). Это гораздо проще сделать в Rails 3, чем в Rails 2 (плагин не требуется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...