【问题标题】:Rails Devise authenticatate_user not workingRails设计authenticate_user不工作
【发布时间】:2013-06-28 10:18:04
【问题描述】:

我是 Ruby on Rails 的新手,目前我想使用 Devise gem 进行身份验证系统。系统需要只有管理员才能列出用户并创建新用户。 (我通过向 Devise 生成的用户模型添加管理员布尔字段来添加管理员角色)。我使用 Rails 3.2、Ruby 1.9.3 和最新的 Devise gem。

但是,下面列出的代码不会阻止未经身份验证的用户访问特定操作(索引、新建和创建)。

# users_controller.rb
class UsersController < Devise::RegistrationsController
  before_filter :authenticate_user!, only: [:index, :new, :create]
  before_filter :is_admin, only: [:index, :new, :create]

  def index
  end

  private

  def is_admin
    current_user.admin?
  end
end

==

# config/routes.rb
App::Application.routes.draw do
  root to: 'static_pages#home'

  get '/about', to: 'static_pages#about'

  devise_scope :user do
    get '/users', to: 'users#index'
  end

  devise_for :users, controllers: { sessions: "sessions", registrations: "users" }
end 

authenticate_user! 方法不起作用(例如,未经身份验证的用户仍然可以访问/users/users/sign_up)但也不会引发任何异常。我做了一些搜索,但不知道为什么。请帮忙。

PS。对不起我的英语。

更新

感谢所有回答。我将更新is_admin 以按照指出的方式正常工作。

但这里的主要问题是未登录的用户首先可以通过authenticate_user! 过滤器(并在is_admin 方法上引发异常,因为这里的current_user 将为nil)。

# Here non logged in users does not redirect to sign in page when access to,
# for example, /users or /users/sign_up.
before_filter :authenticate_user!, only: [:index, :new, :create] 

抱歉不明显。

【问题讨论】:

  • 使用CanCan gem。
  • 检查我的更新答案
  • 非常感谢你们。我会试试的。

标签: ruby-on-rails devise


【解决方案1】:

来自设计文档:

Devise 将创建一些助手以在您的控制器和视图中使用。要设置具有用户身份验证的控制器,只需添加此 before_filter:

before_filter :authenticate_user!

要验证用户是否已登录,请使用以下帮助程序:

user_signed_in?

对于当前登录的用户,此助手可用:

current_user

所以,:authenticate_user!只会使控制器上的所有其他助手可用(前提是您将其放入 :before_filter),但定义签名/未签名用户的逻辑仍然是您的责任!

请记住,Devise 是一种身份验证解决方案,而不是授权解决方案。如果您需要在不自己编写所有逻辑的情况下处理授权(似乎是这样),请使用 CanCan 之类的东西,它与 Devise 完美结合。

【讨论】:

  • 谢谢你:)。我会在这里投票给每个人,但我刚刚注册了这个网站,我的声誉很低,很抱歉。
  • 据我所知,您的投票限制与我相同。欢迎访问该网站,不要忘记接受您认为最好的答案!
【解决方案2】:

显然你需要检查一个有效的会话用户,然后进行如下操作..

def is_admin
  if current_user.nil?
    redirect_to_some_path
  else
    if current_user.admin?
      true
    else
      redirect_to some_path
    end
  end
end

【讨论】:

    【解决方案3】:

    is_admin 方法上使用if..else 语句

    before_filter :authenticate_user!, only: [:index, :new, :create]
    before_filter :is_admin, only: [:index, :new, :create]
    
    private
    
    def is_admin
     if user_signed_in?
      if current_user.admin?
        true
      else
        redirect_to some_path
      end
     else
       redirect_to login_path
     end
    end
    

    【讨论】:

    • 感谢您的快速答复。该代码适用于重定向非管理员用户(感谢您注意到这一点)。但是我的第一个问题是未登录的用户可以通过authenticate_user! 过滤器访问索引、新建或创建操作(因此在is_admin? 上引发异常,因为current_user 这里是零)。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多