【问题标题】:How to secure user show page alongside user admin functions when using devise使用设计时如何保护用户显示页面以及用户管理功能
【发布时间】:2013-04-19 17:38:03
【问题描述】:

我正在使用设计并让管理员使用Manage::UsersController 管理用户。

这是使用 cancan 锁定的:

# models/ability.rb    
def initialize(user)
  if user admin? 
   can :manage, User
  end
end

普通用户只能通过设计与用户无关,因此一切看起来都很安全。

现在我想为用户提供一个“显示”页面来显示他们自己的帐户信息(而不是自定义设计“编辑”页面)。建议 (1,2,3) 似乎是添加带有 show 方法的 users_controller。

我试图让非管理员能够阅读他们自己的信息:

if user admin? 
  can :manage, User
else
  can :read, User, :id => user.id    # edited based on @Edwards's answer
end

但这似乎并没有限制对Manage::UsersController#index 的访问,因此这意味着每个人都可以看到所有用户的列表。

实现这一目标的最简单方法是什么?我可以看到两个选项,(但我不确定哪个是正确的):

1) 阻止用户访问Manage::UsersController#index

def index
  @users = User.all
  authorize! :manage, User   # feels hackish because this is 'read' action
end

2) 覆盖设计控制器

根据this answer 重写设计控制器可能是一个好方法,但问题是which controller(注册控制器?)以及如何。我对这条路线的担忧之一是我想要显示的信息与用户对象有关,但不是专门设计的(即用户计划信息等)。我也担心在尝试测试时会陷入困境。

你有什么推荐的?

【问题讨论】:

    标签: ruby-on-rails devise cancan


    【解决方案1】:

    在您的ability.rb 中有

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

    User 模型没有 user_id - 您希望登录用户能够看到他们自己的帐户 - 也就是说,它与 current_user 具有相同的 id。此外,:read[:index, :show] 的别名,您只需要:show。所以,

      can :show, User, :id => user.id
    

    应该做的工作。

    【讨论】:

    • 对不起。那是我清理东西时的错误。将其更改为 can :read, User, :id => user.id 似乎不会禁止访问索引操作。
    • 啊。如果我没记错的话:read[:index, :show] 的别名。所以试试:show
    • 你是对的!这确实有效。我只是让这个答案开放一段时间,看看是否有人想出一种让用户完全远离管理区域的方法(Manage::UsersController),否则我会继续接受你的答案。
    【解决方案2】:

    我会将您的注册和身份验证保留为设计控制器;然后,创建您自己的不是设计控制器的用户控制器。

    在您自己的控制器中,我们称其为 ProfilesController,您只能显示一个配置文件(当前用户)的特定操作

    路线

    resource :profile
    

    配置文件控制器

    class ProfilesController
      respond_to :html
      def show
        @user = current_user
      end
    
      def edit
        @user = current_user
      end
    
      def update
        @user = current_user
        @user.update_attributes(params[:user])
        respond_with @user
      end  
    end
    

    由于它始终只编辑你,它限制了编辑或查看他人的能力。

    【讨论】:

    • 谢谢杰西。我不明白的一点是,我必须在 cancan 中授予某种用户权限,以便人们可以看到他们自己的个人资料,但是我将如何以一种不让他们访问 Manage:: 的方式做到这一点用户控制器#index?
    • @DerekHill 在我的示例中没有 ProfilesController 的索引
    • 否,但在 Manage::UsersController 上有允许管理员查看所有用户的列表。
    • 如果你想坚持cancan的授权模式,authorize! :manage, User没有错。
    • Derek -- 约定是有一个用户和一个管理员(每个不同的设计模型),以及authenticate_admin!对于您只希望管理员能够访问的区域。然后,用户只能自己管理。
    猜你喜欢
    • 2015-01-16
    • 2019-12-09
    • 2018-05-11
    • 1970-01-01
    • 2023-03-05
    • 2011-11-04
    • 2014-09-13
    • 2016-05-21
    相关资源
    最近更新 更多