如何在Rails中实现对上传资产的访问控制?
How to implement access-control for uploaded assets in Rails?
我有一个包含管理员和普通用户的应用(两个不同的模型)。两者都可以上传文件。目前,文件模型没有 uploaded_by
属性或与 Admin
/User
模型有任何关联。一旦某个文件被某人上传,它就会被添加到整个列表中,每个人 sees/can 都会删除所有内容。我需要这个:
- 管理员继续see/be能够删除所有内容;
- 用户可以see/are只能删除自己的文件、管理员上传的文件,不能删除非管理员上传的文件;
我想请教如何实现这个。
我可以为文件添加一个多态 belongs_to
,然后执行类似 - File.where(owner: current_user) + File.where(owner_type: 'admin')
.
的查询
我可以使用自己的系统或使用 punidt
或 cancancan
之类的东西。
您已经回答了您的问题。是的,运行 punidt
或 cancancan
并添加多态关系是很好的方法。我只能补充一点,您的查询要简单得多:
File.where(owner: current_user)
无需检查 owner_type
。
更复杂的模型
另一方面,我对您模型的简单性感到惊讶。如果您需要在单个文件上定义多个规则怎么办。例如,user1 是文档的所有者,user2 和 user3 是编辑者,user4 只是查看者。
在这种更复杂的情况下,您可能需要一个名为 UserFileRole
的单独模型,其中包含 user
(多态)、file
和 role
字段。
我个人会选择这种模式,因为就编辑文档的权利而言,只是"admin"仍然没有任何意义。他们是两个不同的角色。所以应该单独定义。
不过,如果您的系统真的像您描述的那样简单,那么您的设计就非常好。
我有一个包含管理员和普通用户的应用(两个不同的模型)。两者都可以上传文件。目前,文件模型没有 uploaded_by
属性或与 Admin
/User
模型有任何关联。一旦某个文件被某人上传,它就会被添加到整个列表中,每个人 sees/can 都会删除所有内容。我需要这个:
- 管理员继续see/be能够删除所有内容;
- 用户可以see/are只能删除自己的文件、管理员上传的文件,不能删除非管理员上传的文件;
我想请教如何实现这个。
我可以为文件添加一个多态 belongs_to
,然后执行类似 - File.where(owner: current_user) + File.where(owner_type: 'admin')
.
我可以使用自己的系统或使用 punidt
或 cancancan
之类的东西。
您已经回答了您的问题。是的,运行 punidt
或 cancancan
并添加多态关系是很好的方法。我只能补充一点,您的查询要简单得多:
File.where(owner: current_user)
无需检查 owner_type
。
更复杂的模型
另一方面,我对您模型的简单性感到惊讶。如果您需要在单个文件上定义多个规则怎么办。例如,user1 是文档的所有者,user2 和 user3 是编辑者,user4 只是查看者。
在这种更复杂的情况下,您可能需要一个名为 UserFileRole
的单独模型,其中包含 user
(多态)、file
和 role
字段。
我个人会选择这种模式,因为就编辑文档的权利而言,只是"admin"仍然没有任何意义。他们是两个不同的角色。所以应该单独定义。
不过,如果您的系统真的像您描述的那样简单,那么您的设计就非常好。