如何在使用设计时保护用户显示页面以及用户管理功能

时间:2013-04-19 17:38:03

标签: ruby-on-rails devise cancan

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

这是使用cancan锁定的:

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

除了通过设计之外,普通用户可以与用户无关,因此一切看起来都很安全。

现在我想为用户提供一个“显示”页面,用于显示他们自己的帐户信息(而不是自定义设计'编辑'页面)。建议(123)似乎是添加带有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(注册控制器?)以及如何。我走这条路线的一个问题是我想要显示的信息与用户对象有关,但没有具体设计(即用户计划信息等)。我还担心在试图测试时会陷入困境。

你推荐什么?

2 个答案:

答案 0 :(得分:1)

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

在你自己的控制器中,我们称之为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

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

答案 1 :(得分:1)

在你的ability.rb

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

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

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

应该做的。