繁体   English   中英

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

[英]Using rails, devise and cancan, a signed in user can access the sign in and sign up paths

我不确定自己做了什么,但是已登录的用户可以访问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

扩展Devise Sessions控制器:

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

我意识到我可以将一些代码添加到控制器操作中或在before过滤器中,以检查登录用户并重定向它们。 但是,Devise提供了功能,我不必这样做。 恐怕这样做可能会忽略一个更大的问题,也许与Devise的配置有关。

感谢您的帮助! 谢谢!

为设计1.5.3; 不是真正的答案,而是一些有关引擎盖下发生的事情的指示。
用户登录时用于重定向的过滤器是require_no_authentication
在装置的会话注册控制器中已经称为它。
由于扩展了这些控制器,并且继承了过滤器,因此应该应用该行为。

一些可能的动作:

  • 添加断点以查看是否调用了过滤器
  • 内省控制台中的控制器以查看过滤器是否已注册
  • 检查过滤器的控制流程; 您是否修改过Devise.navigational_formats
  • 仔细检查设计版本

经过大量的搜索和尝试,我决定重新实施设计,并且成功了。 我仍然不确定一开始我是如何设法打破功能的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM