【问题标题】:Security: using CanCan to make sure user cannot see other users' profiles安全性:使用 CanCan 确保用户无法看到其他用户的个人资料
【发布时间】:2023-07-12 15:33:01
【问题描述】:

我有一个使用 Devise、CanCan 和 Rolify 来处理身份验证和授权的应用程序。但我认为我并没有充分利用这些宝石。现在我的能力班里唯一的东西是这样的:

class Ability

  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.has_role? :admin
      can :manage, :all
    else
      can :read, :all
    end
  end
end

我发现了一个安全漏洞,经过身份验证的用户可以查看其他用户配置文件。我通过更改用户控制器中的一些代码来修复它。

def show
  @user = current_user.has_role?(:admin) ? User.find(params[:id]) : current_user
end

这是处理这个漏洞的最佳方法吗?是否有以不同方式解决此问题的最佳实践或 Rails 约定?

【问题讨论】:

    标签: ruby-on-rails security devise cancan


    【解决方案1】:

    From the doc:

    can :read, ModelName, :user_id => user.id
    

    【讨论】:

    • 我看到了。问题是它并没有真正改变我的应用程序的行为。我最初有 can :read, User, :id => user.id 而不是 can :read, all 但它没有做任何事情,所以我认为它没关系。如果您确信这是我的问题,请告诉我您是否认为我只是弄乱了语法,或者背景中是否存在其他导致这种奇怪行为的大问题。
    • 就是这样,你是怎么测试的?
    • 我通过重新启动服务器、登录、导航到 /users/:id 处的用户配置文件并更改 ID 号来测试它。
    • 你授权控制器中的资源吗?
    • 啊哈。不,我不是。我原本在那里有load_and_authorize_resource,但在解决我的错误的过程中已经将其注释掉了。谢谢!
    最近更新 更多