Rails控制器和用户权限

时间:2017-03-21 18:27:06

标签: ruby-on-rails redirect devise controller action

我遇到了一个非常简单的Rails问题。

我有一个博客控制器,它有以下几行:

skip_before_action :check_admin, only: [:index, :show], raise: false

...

private
...

def check_admin
  redirect_to(root_path) unless current_user && current_user.admin?
end

我希望行为如下:

如果用户未登录或登录且其角色不是admin,并尝试访问其他操作而不是:index和:show,则应重定向到根路径。

但是现在,它显示了用户未登录时每个操作的用户登录页面,而它允许任何登录用户的每个操作,甚至不包括管理用户。

我正在使用Devise和CanCanCan。我的ability.rb看起来像这样:

def initialize(user)
  can :read, :all                   # allow everyone to read everything
  if user && user.admin?
    can :access, :rails_admin       # only allow admin users to access Rails Admin
    can :dashboard                  # allow access to dashboard
    can :manage, :all
  end
end

我在哪里失败?

编辑:我将控制器中的操作调用更改为:

before_action :check_admin, except: [:index, :show]

现在,对于已记录的用户显示了所需的行为,而对于未记录的用户,它仍然会重定向到包含索引和显示的每个操作的用户登录页面。

编辑2 :我在before_action :authenticate_user!中有application_controller.rb,而其他一些控制器设置为skip_before_action :authenticate_user!, :only => [:index]。但在我看来,这不应该干扰博客控制器...

另外,我在config/initializers/rails_admin.rb中有以下内容:

RailsAdmin.config do |config|

  ### Popular gems integration

  ## == Devise ==
  config.authenticate_with do
    warden.authenticate! scope: :user
  end
  config.current_user_method(&:current_user)

1 个答案:

答案 0 :(得分:0)

问题是你有before_action:authenticate_user!在你的应用程序控制器如果你看到你的控制器定义,那么:

class BlogController< ApplicationController

'&LT;'运算符意味着BlogController继承自ApplicationController,因此所有控制器(具有skip_before_action的控制器除外)都需要进行身份验证。

你需要

Class BlogController < ApplicationController
skip_before_action :authenticate_user!, :only => [:index, :show]