我正在使用设计并让管理员使用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(注册控制器?)以及如何。我走这条路线的一个问题是我想要显示的信息与用户对象有关,但没有具体设计(即用户计划信息等)。我还担心在试图测试时会陷入困境。
你推荐什么?
答案 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
应该做的。