0

我想将我的应用程序发布给一组选定的个人以进行私人测试。我为此任务创建了一个子域:beta.company.com。

该应用程序在我的工作站上按预期运行,但是当我将其推送到服务器时,该应用程序会不断路由回身份验证页面。仅供参考,我正在使用声明性授权、授权逻辑和乘客。

路线.rb:

  #Application controller
  match "/not_authorized", :to => "application#not_authorized", :as => :not_authorized

  #UserSessions controller
  match "/quit", :to => "user_sessions#destroy", :as => :quit
  match "/authenticate", :to => "user_sessions#new", :as => :authenticate
  resources :user_sessions, :only => :create

  #Users controller
  match "/enroll", :to => "users#new", :as => :enroll

  # root url
  root :to => "users#index"

症状:

  • 匿名路由(例如 user_sessions#create、not_authorized)按预期对 anon 工作。用户
  • 该应用程序在我的工作站上按预期运行

当我查看 production.log 时,我看到如下条目:

由 UsersController#index 处理为 HTML 权限被拒绝:没有为 #@role_symbols=[:guest]> 的索引找到匹配规则(角色 [:guest]、权限 [:index、:read、:manage]、上下文 :users)。重定向到http://beta.company.com/authenticate

** 编辑 **

一方面,没有 UsersController#index 操作,如果有,匿名用户将无权访问它。我很困惑为什么它试图在那里路由(而不是根 url,这是它应该在成功认证后去的地方)。

这似乎是一个特定于子域​​的路由问题,但我不能确定。

更仔细地重新阅读这个“错误”。有一个 UserController#index 操作,匿名用户不应该访问它。乍一看,我以为它读取了UserSessionController#index,这是不存在的动作。

现在,似乎没有创建或保存经过身份验证的用户,因此被重新路由回 UserSession#new 操作(AKA 身份验证路径)。

** / 编辑 **

** 编辑二 **

我从 cookie_store 更改为 active_record_store:

# cookie store
# MyApp::Application.config.session_store :cookie_store, :key => '_myApp_session'
# active-record store
MyApp::Application.config.session_store :active_record_store

添加表($ rake db:sessions:create),进行迁移($ rake db:migrate),重新启动 Apache($ touch tmp/restart.txt),清除浏览器的缓存,然后重新启动浏览器。

会话已成功添加到会话表中,但我仍然遇到问题。

** / 编辑二 **

非常感谢您的想法。

4

2 回答 2

0

对于初学者......</p>

一方面,没有 UsersController#index 操作,如果有,匿名用户将无权访问它。我很困惑为什么它试图在那里路由(而不是根 url,这是它应该在成功认证后去的地方)。

您的根 URL 是 UsersController#index:

# root url
root :to => "users#index"

检查以确保您在 beta 域上设置 cookie。您可能正在重定向或设置使用完整 URL(而不仅仅是路径,所以user_url(@user)vs user_path(@user))的链接,这将导致您直接前往根域。

于 2011-02-09T14:32:33.807 回答
0

该问题与控制器中的 SELECT 语句有关。SELECT 语句中的表名“SELECT Users.*”区分大小写导致错误。由于某种原因,此错误未包含在 production.log 文件中。随后的部署(不使用 Capistrano)做了一些事情(我仍然不知道是什么)以使该错误包含在 production.log 文件中。

现在,如果我能确定那个“东西”是什么……

于 2011-02-10T17:47:09.780 回答