2010-02-19 2 views
3

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

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

EDIT Я думаю, что тот факт, я использую AuthLogic важно здесь, потому что поддомен логик разве переадресации пользователей в любом месте после того, как проверка подлинности AuthLogic отправляет пользователь/счет - так что мой вопрос может быть связан с тем, как я сказать 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 

SubdomainCompanies Модуль

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 

ответ

3

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

Возможно, это выглядит примерно так.

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

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

+0

Я действительно хотел избежать использования плагина, я чувствовал, что это было излишним для наших простых потребностей. НО, мне просто нужно пойти по этому маршруту. Если пользователи набирают этот URL-адрес, и они не аутентифицированы, будет ли поддомен-fu каким-либо образом перенаправлять их или отображать правильный макет? Прежде чем я пойду и установлю плагин, я хочу убедиться, что он будет работать с Authlogic .. Вы сделали это? – Rabbott

3

ДЛЯ РЕЛЬСЫ 2,3: Вы можете загрузить полный пример приложения (с учебника шаг за шагом), показывающий, как реализовать администратора поддомена, основной домен и несколько поддоменов пользователей с использованием драгоценных камней DEViSE для аутентификации и жемчужина субдомен-маршрутов для управления субдоменами. Вот ссылка: subdomain authentication for Rails 2.3.

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

Смежные вопросы