1

我正在使用设计并让管理员使用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) 覆盖设计控制器

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

你有什么建议吗?

4

2 回答 2

1

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

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

路线

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

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

于 2013-04-19T18:28:33.903 回答
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

应该做的工作。

于 2013-04-19T18:52:00.847 回答