我正在使用Symfony3构建一个API后端,并且有一个关于如何将字段级权限应用于PUT端点以更新对象(本例中为User)的问题。
我的用户实体有多个字段,firstName、lastName、username等。
如果PUT请求被发送到/users/{userId}端点,我将请求JSON反序列化为一个数组,将该数组(以及从数据库获取的用户)传递到一个规范化程序中,后者将请求数据应用于用户属性。
我想一个管理员能够更新所有字段,但用户自己只能更新他们的名字和姓氏。
因此,在我的代码中的某个地方,我需要在将更新应用于User对象之前进行检查,例如,如果username字段存在于PUT请求中,则在将该更新应用于user对象之前,我需要检查发出请求的用户是否为管理员。
将安全性注入规范化程序似乎是一个显而易见的解决方案,但感觉安全性不应该成为规范化程序的问题。
我可以在反序列化请求之后,在传递给规范化程序之前检查权限,如果用户没有访问权限,则只从数组中删除字段,例如,如果不是admin,则从数组中删除用户名。
寻找实现这一目标的正确方法的想法/建议……
谢谢!
发布于 2017-09-10 04:59:54
我想发布一些我在#symfony IRC中得到的反馈:
我不会让规范化程序写入用户。我会让规范化程序生成一个DTO,然后在给定目标用户和执行操作的用户的权限的情况下对其进行验证。
如果验证器失败,则抛出全部内容并返回权限被拒绝的错误,否则将DTO应用于用户并持久化它。
“验证器”可以是一个表单(使用are构建一个表单,以修改给定的活动用户和目标用户的字段;如果提交了额外的字段,则表单无效)。或者它可以是一个安全投票者,或者是您自己的自定义机制。
https://stackoverflow.com/questions/46134906
复制相似问题