使用rails,devise和cancan,登录用户可以访问登录和注册路径

时间:2012-01-14 05:40:16

标签: ruby-on-rails ruby-on-rails-3 devise rails-routing

我不确定我做了什么,但是已登录的用户可以访问new_user_session_path和new_user_registration_path。通常在设计中,不应允许用户访问这些路径。如果有所作为,我正在使用cancan。我创建了一个新的rails应用程序并复制了路由并扩展了注册和会话控制器,无法复制问题。

如果有人甚至可以指出我在Devise中重定向的方向,我将不胜感激。

在initializers / devise.rb配置文件中,添加到默认文件的唯一行是:

config.scoped_views = true

如果我能提供任何其他有用的信息,请告诉我。 我正在使用Devise(1.5.3),CanCan(1.6.7)和Rails(3.1.1)

路线档案:

MyApp::Application.routes.draw do

  devise_for :users, :controllers => { :sessions => "sessions", :registrations => "registrations" }, :skip => [ :sessions, :registations ] do

    get    '/signin'   => 'sessions#new',     :as => :new_user_session
    post   '/signin'   => 'sessions#create',  :as => :user_session
    delete '/signout'  => 'sessions#destroy', :as => :destroy_user_session

    get    '/signup'       => 'registrations#new',    :as => :new_user_registration
    post   '/users'        => 'registrations#create', :as => :user_registration
    get    '/users/cancel' => 'registrations#cancel', :as => :cancel_user_registration
    get    '/settings'     => 'registrations#edit',   :as => :edit_user_registration

    put    '/account'      => 'registrations#update'
    delete '/users'        => 'registrations#destroy'
  end

  resources :users

  match '/contact',   :to => 'pages#contact'

  root :to => 'pages#contact'

end

扩展设计注册控制器

class RegistrationsController < Devise::RegistrationsController

  # POST /resource
  def create
    build_resource

    resource.company = Company.find_by_code(params[:company_code])
    resource.role = Role.find_by_name("Basic")

    if resource.save
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_in(resource_name, resource)
        respond_with resource, :location => after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :inactive_signed_up, :reason => inactive_reason(resource) if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      respond_with resource
    end
  end

end

扩展设计会话控制器:

class SessionsController < Devise::SessionsController
  layout "sessions"
end

我意识到我可以在控制器操作或之前的过滤器中添加一些代码来检查登录用户并重定向它们。然而,Devise提供了功能,我不应该这样做。我担心这样做可能会忽略一个更大的问题,也许是Devise的配置。

我感谢任何帮助!谢谢!

2 个答案:

答案 0 :(得分:1)

设计1.5.3;这不是一个真正的答案,而是关于引擎盖下发生了什么的一些指示 用户登录时用于重定向的过滤器为require_no_authentication 它已在设备的sessionsregistrations控制器中调用 由于您继承了这些控制器和过滤器,因此应该应用该行为。

一些可能的行动:

  • 添加断点以查看是否已调用过滤器
  • 在控制台中内省控制器以查看过滤器是否已注册
  • 检查过滤器的控制流程;你有Devise.navigational_formats
  • 修补
  • double check devise version

答案 1 :(得分:0)

经过大量的搜索和尝试后,我决定重新实现设计并完成了诀窍。我仍然不确定我是如何设法打破功能的。