【问题标题】:Devise and CanCan cannot :destroy User设计和 CanCan 不能 :destroy 用户
【发布时间】:2013-11-20 04:05:26
【问题描述】:

我有一个使用 CacCan 和 Devise 的应用程序。我正在让 Devise 处理用户销毁操作

路线

DELETE /users(.:format)    devise/registrations#destroy

我的控制器

class UsersController < ApplicationController
  skip_before_filter :authenticate_user!, :only => :portfolio

  def index
    redirect_to dashboard_user_path(current_user)
  end

  def dashboard
    ...
  end

  def portfolio
  end
end

我的能力.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.role?('Administrator')
      can :access, :rails_admin
      can :dashboard
      can :manage, :all
    else
      cannot :destroy, User
      can :read, :all
      ...
    end
  end
end

上面的这段代码不起作用。不是管理员的用户仍然可以删除用户。我假设原因是我没有 UsersController#destroy 方法。

所以我的问题是,如何让 CanCan 阻止非管理员用户删除用户?

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: ruby-on-rails devise authorization cancan


    【解决方案1】:

    在我看来,您定义了能力,但根本没有使用它们。

    我建议至少阅读this(gem 有一个访问 wiki,其中包含非常有用的信息,因此值得阅读所有文章)。 我更喜欢使用强大的load_and_authorize_resource,但在你的情况下可能足够authorize!(代码未经测试!)

    def destroy
      @user = User.find(params[:id])
      authorize! :destroy, @user
      ...
    end
    

    【讨论】:

    • 感谢您的回答。我试过授权!使用 load_and_authorize_resource 并且删除仍然发生在不是管理员的用户身上。我想知道是否有办法对从设计调用的操作实施授权。我这么说的原因是;我可以在我的控制器中创建一个方法并为该方法创建一个路由。然后进行您建议的更改。但它不会阻止某些人运行 devise/registrations#destroy 会删除用户。
    • 好吧,我认为(但我不确定)销毁路由会转到另一个控制器/动作。我发现了几个例子:this 断言设计不提供destroy 操作,devise wiki 提供了另一个例子。我建议在用户销毁帐户时检查您的操作是否有效 - 然后调试能力,否则尝试实施设计示例并在那里应用 authorize
    • Devise::RegistrationsController#destroy 中的第一行是 resource.destroy。我相信这使用我的 User#destroy 方法。不确定我是否可以使用第一个链接,但设计 wiki 的第二个链接似乎很有希望。我会看看它,如果它有效,请告诉你。
    猜你喜欢
    • 2011-10-07
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多