3

我有一个现有的 Rails 3 站点。本站使用 Devise 登录。

现在我需要添加一个单独登录的子站点。假设它位于 mysite.com/special。访问 /special 的每个人都需要使用与主站点不同的一组凭据登录。这些凭据对主站点无效,但它们必须同时能够登录到主站点并保持登录状态。

让情况稍微复杂一点的是,“特殊”用户能够冒充普通用户的子集。如果他们确实冒充,退出冒充等等,他们必须保持登录到特殊站点,直到他们明确地在那里注销。

我最初的想法是为整个子站点使用单独的会话 cookie,但我不知道该怎么做。我尝试设置这样的东西,但此时几乎是猜测。

scope '/special' do 
    devise_for :special_users, :controllers => { :sessions => "special/sessions" }, :skip => "registrations", :module => "special_users"
    unauthenticated do
      as :special_user do
        root :to => 'special/sessions#new'
      end
    end
end  

不幸的是,我对 Rails 有点陌生,这似乎相当复杂。甚至有可能使用设计,如果是这样,是否有人对如何去做有任何指示?

4

1 回答 1

2

事实证明,这就是作用域的用途。当您知道他们如何称呼它时,一切都会变得更有意义;)无论如何,上面 Qumaras 的评论实际上是在正确的轨道上),并且教程和 wiki 通常是很好的信息来源。一种可能的方法:

  devise_for :spuser, :controllers => { :sessions => "sp/spusers/sessions"}
  as :spuser do # as = equiv. to devise_scope
    # add spuser specific items here, such as:
    unauthenticated :spuser do
      root :to => 'sp/spusers/sessions#new'
    end
  end

然后,如果您想以普通用户身份登录另一个选项卡,您可以在控制器中执行此操作。

def impersonate
  @user = User.first
  sign_in(:user, @user)
  redirect_to '/main'
end

并将模拟操作连接到 routes.rb

resources :regularcustomers do
  member do
    get :impersonate
  end
end

然后你可以在视图中调用它:

<%= link_to @customer.name, impersonate_regularcustomers_path(@customer), :target => 'impersonationtab' %>
于 2013-01-10T12:17:31.957 回答