创建会话时在Authlogic中指定Cookie域

时间:2010-01-10 23:09:39

标签: ruby-on-rails cookies authlogic

使用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

3 个答案:

答案 0 :(得分:4)

如果你这样做:

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

在您的production.rb文件中

,这将允许您让所有人登录到子域的所有子域。如果你然后添加一个过滤器(或其他任何东西,但我使用过滤器,所以我知道它有效),在显示控制器内容之前检查某人是否正在使用正确的域,它的效果非常好。

例如,您可以将会话的相应子域存储为会话变量,并为人们提供指向其特定事物的链接选项(如果它们位于您的主域中或查看其他人的子域中的页面)。

这似乎是执行此类操作的一般模式 - 如果您设置特定于子域​​的cookie,否则您将无法分辨他们何时登录到主站点。我还有一个'users_domain?'帮助器,当我这样做时,它最终会在视图中偶尔被调用。

如果你不想拥有那些常见的网页设计模式,那么wesgarrion可以单独使用 - >在子域上创建会话也是一种方法。我只是认为我会将其视为设计/交互/代码问题。

答案 1 :(得分:0)

如果要在子域中登录,可以使用Authlogic的一次性令牌。

查看Params module以获取使用一次性令牌登录的示例。

当然,您的操作会将其记录下来并创建会话(在子域上),这样他们就不必为下一个请求重新进行身份验证。

选项可以在process_cgi()session()中为Cookie设置域名,但我没有看到在Authlogic中设置每个请求的方法。然而,authlogic邮件列表非常敏感,这似乎是一个非常标准的用例,有人会尝试并弄清楚。呃,我在谷歌小组看到了你的笔记,所以不要紧。

答案 2 :(得分:0)

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

从扩展程序中包含ActionController中的挂钩。

base.send :after_dispatch, :force_session_cookies_to_subdomains

在after_ dispatch hook中设置域名。

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

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

使用这种方法,用户的登录必须在子域中进行,以便浏览器接受子域的cookie(除非使用类似Authlogic Params的模式传播到针对子域的下一个请求)。

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

类似结束的另一种方法可能是强制cookie不在子域中时设置。没有花太多时间,我能够实现这一点的方式是 -

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

在ApplicationController中的后置过滤器中。