4

使用 Authlogic 创建会话时,是否可以将 cookie 域设置为当前域以外的其他域?

从我们的注册域创建新帐户时,我想将用户重定向到他们的子域帐户并登录用户。

电流控制器:

def create
  @account = Account.new(params[:account])
  if @account.save
    @user_session = @account.user_sessions.create(@account.users.first)
    # I'd like the cookie domain to be [@account.subdomain, APP_CONFIG[:domain]].join(".")
    redirect_to admin_root_url(:host => [@account.subdomain, APP_CONFIG[:domain]].join("."))
  else
    render 'new'
  end
end
4

3 回答 3

4

如果你这样做:

config.action_controller.session[:domain] = '.YOURDOMAIN.COM'

在您的 production.rb 文件中,这将允许您让每个人都登录到您的子域的所有子域。如果您然后添加一个过滤器(或其他任何东西,但我使用了一个过滤器,所以我知道它有效)在您显示控制器内容之前检查某人是否实际使用了正确的域,它工作得很好。

例如,您可以将会话的适当子域存储为会话变量,如果人们在您的主域上或查看其他人的子域上的页面,则为他们提供指向其特定事物的链接选项。

这似乎是做这类事情的一般模式——如果你设置一个特定于子域​​的 cookie,否则你将无法判断他们何时登录到主站点。我还有一个“ users_domain?”助手,当我这样做时,它最终会在视图中偶尔被调用。

如果您不想拥有那些常见的网页设计模式,那么 wesgarrion 的单次使用 -> 在子域上创建会话也是一种方法。我只是想我会提到这是一个设计/交互/代码问题。

于 2010-02-04T20:40:22.663 回答
0

如果您想在子域上登录它们,您可以使用 Authlogic 的一次性令牌。

查看Params 模块以获取有关使用一次性令牌登录的示例。

自然,您的操作将使他们登录并创建他们的会话(在子域上),因此他们不必为下一个请求重新验证。

在process_cgi()session()中有设置 cookie 域的选项但我看不到在 Authlogic 中设置这些每个请求的方法。不过,authlogic 邮件列表的响应速度非常快,这似乎是一个非常标准的用例,那里的人会尝试并弄清楚。呃,我在 google 群组上看到了你的笔记,所以别介意。

于 2010-01-17T01:50:47.730 回答
0

如果您有一个具有多个子域的应用程序并且不希望在它们之间共享会话 cookie,或者更糟 - 有一个顶级 .domain 会话 cookie 与您的子域会话 cookie 一起浮动具有相同的 session_key(Rails 将保留一个和折腾另一个-我相信只是基于请求标头中的顺序)-您可以使用调度程序挂钩将会话cookie强制到子域。

从扩展中将钩子包含在 ActionController 中。

base.send :after_dispatch, :force_session_cookies_to_subdomains

在你的 after_ 调度钩子中设置域。

@env['rack.session.options'] = @env['rack.session.options'].merge(:domain => 'my_sub_domain' end)

对于我们来说,我们查看 @env[HTTP_HOST] 来确定 [my_sub_domain] 应该是什么。

使用这种方法,用户的登录必须发生在子域中,以便浏览器接受子域的 cookie(除非使用像 Authlogic 参数这样的模式来传播到针对子域的下一个请求)。

注意:当请求来自更高级别的域时,浏览器将拒绝子域的 cookie。对我们来说,这不是一件坏事——它会产生我们需要的相同结果,即不会创建顶级会话 cookie 并稍后将其发送到子域。

达到类似目的的另一种方法可能是在不是来自子域时强制不设置 cookie。没有花太多时间,我能够做到这一点的方式是 -

request.env["rack.session"] = ActionController::Session::AbstractStore::SessionHash.new(self, request.env)

在 ApplicationController 的后过滤器中。

于 2010-03-01T20:09:12.830 回答