如何创建一个管理员子域来管理Rails中的子域名
我正在使用AuthLogic和012h中包含的子域名方法,所有事情都很好,并且和预期的一样。我试图弄清楚的是,如何创建一个子域名,如'admin'或'host',这个子域名将拥有一个AuthLogic认证的用户(这可能是微不足道的,不必提及)将管理子域名。所以基本上,所有的子域名将正常工作,除了admin.site.com这将去自己的控制器和布局..如何创建一个管理员子域来管理Rails中的子域名
dhh建议只是抛出一个异常重定向,但我不知道哪里去了,它对我来说似乎不那么简单,有什么想法?
编辑 我认为我使用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
调查subdomain-fu它允许您路由到不同的控制器和基于子域的操作。关于这个问题,我做了一个Railscasts Episode。
它可能看起来像这样。
# in routes.rb
map.manage_companies '', :controller => 'companies', :action => 'index', :conditions => { :subdomain => "admin" }
这将需要在路由列表中足够高,所以在它之前没有其他匹配。
为Rails 2.3:你可以下载一个完整的示例应用程序(用一步一步的教程)展示了如何使用设计的宝石进行身份验证,以实现一个管理子域,主域和多个用户的子域和子域 - 路由gem管理子域。以下是链接:subdomain authentication for Rails 2.3。
为Rails 3:这里有Rails 3 subdomains with authentication一个完整的示例实现(连同一个详细的教程)。在Rails 3中执行此操作比在Rails 2中执行操作要简单得多(不需要插件)。
我真的很想避免使用插件,我觉得这对我们简单的需求来说太过分了。但是,我可能只需要走这条路线 - 如果用户点击该网址,而且他们没有通过身份验证,子域名fu会以某种方式设法重定向它们或显示正确的布局?在我去安装插件之前,我想确保它能与Authlogic一起工作。你做过这些了吗? – Rabbott 2010-02-19 21:32:29