我正在以这种方式保护我的实体的安全:
/**
* @ApiResource(
* collectionOperations={
* "post"={
* "security_post_denormalize"="is_granted('MESSAGE_CREATE', object)"
* },
* "get"={
* "security"="is_granted('ROLE_MANAGER')"
* }
* },
* itemOperations={
* "get"={
* "security"="is_granted('MESSAGE_VIEW', object)"
* },
* "patch"={
* "security"="is_granted('MESSAGE_EDIT', object)"
* },
* "delete"={
* "security"="is_granted('MESSAGE_DELETE', object)"
* },
* "put"={
* "security"="is_granted('MESSAGE_REPLACE', object)"
* }
* }
* )
并且很想知道是否有一种方法可以在 collectionOperations 上执行过滤器,以确保用户对我的集合中的每个项目都有
MESSAGE_VIEW
,而不是执行 is_granted('ROLE_MANAGER')
。我知道 DataProvider 存在,但这些很激进,因为我必须手动重建过滤器...我已经看到我能够使用 security_post_denormalize 进行 POST 并且效果很好,但找不到解决方案“GET”集合部分。有什么想法吗?
非常感谢
我确实同意,数据提供者很有侵略性。您可以通过使用服务来做到这一点。您可以注入安全层以从集合中删除条目。我不喜欢这个解决方案。它在没有(和有)良好的缓存层的情况下使用大量资源。
但是通过扩展,您可以自定义生成的 DQL。您不必添加缓存,因为 Doctrine 会为您做这件事。 扩展是服务,因此您可以注入安全层和其他所需的内容。
它似乎也适用于 Doctrine、Elastic Search 和 MongoDB。 Api-Platform 文档包含一个关于它的简短段落:
根据角色或权限过滤集合 当前用户必须直接在状态提供商级别完成。为了 例如,当使用 Doctrine ORM、MongoDB 的内置适配器时 和 ElasticSearch,应该从集合中删除条目 使用扩展。扩展允许自定义生成的 DQL/Mongo/Elastic/... 用于检索集合的查询(例如添加 WHERE 子句取决于当前连接的用户)而不是 使用访问控制表达式。由于扩展是服务,您可以 将 Symfony Security 类注入其中以访问当前 用户的角色和权限。
在 ApiPlatform 文档中,还有另一个示例,用于仅过滤和检索“当前用户的报价”。这和你的问题没什么不同。你应该看一下它,你会看到注入的安全层。它将帮助您创建自己的扩展。
在api平台文档中我找到了这个解决方案: https://api-platform.com/docs/core/security/#filtering-collection-according-to-the-current-user-permissions
根据当前用户的角色或权限过滤集合必须直接在状态提供者级别完成。例如,当使用 Doctrine ORM、MongoDB 和 ElasticSearch 的内置适配器时,应使用扩展来从集合中删除条目。