Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security Play框架中的安全JPA绑定_Security_Jpa_Binding_Playframework - Fatal编程技术网

Security Play框架中的安全JPA绑定

Security Play框架中的安全JPA绑定,security,jpa,binding,playframework,Security,Jpa,Binding,Playframework,我有一页: <input type="hidden" name="user.id" value="123" /> <input type="text" name="user.name" value="John" /> Play通过user.id参数从数据库中加载用户实体,将HTTP参数绑定到对象,操作将其保存 这对于受信任的用户(如管理员)来说是可以的,但不受信任的用户可以将HTTP参数更改为: ?user.id=456&user.name=John 从而编辑

我有一页:

<input type="hidden" name="user.id" value="123" />
<input type="text" name="user.name" value="John" />
Play通过user.id参数从数据库中加载用户实体,将HTTP参数绑定到对象,操作将其保存

这对于受信任的用户(如管理员)来说是可以的,但不受信任的用户可以将HTTP参数更改为:

?user.id=456&user.name=John
从而编辑不同的实体

我通过将user.id也放入会话来检查user是否更改了user.id,然后验证其相等性。这很好,因为会话已签名,无法修改,但如何轻松检查页面上的许多实体?例如,在执行批量更新时?或者只是在默认情况下在应用程序范围内进行

我不想在会话中放置20个id,然后检查每个id是否等于HTTP参数。
我想到了一个解决办法。我将把一个签名的id作为令牌发送给每个实体,并在绑定期间检查它。您将如何实现此功能?

您可以在控制器中使用CheckAuthentity方法来检查提交表单的真实性


在服务器代码中,您还必须检查用户是否具有更新这些实体的权限。这可以通过在jpa查询中向用户表添加联接来实现,这样您不仅可以在对象id上进行选择,还可以在连接的用户上进行选择。您必须确保只有经过身份验证的用户才能调用save。单程游戏!允许您使用
@Before
注释执行此操作。播放文档中的一个示例:

@Before(unless={"login", "authenticate"})
static void checkAuthenticated() {
    if(!session.contains("user")) {
        login();
    }
}
只有当用户通过身份验证后,
user
session属性才会被放入会话。只有经过身份验证的用户才能向您的
save()
路由发送HTTP请求。特别注意
,除非
注释参数


上面的代码来自剧本中的代码!文档我已经使用过一次,到目前为止,它似乎工作得很好。

据我所知,您需要的是身份验证和授权

身份验证告诉您该用户是谁,您可以通过pHk应答来执行此操作或使用

如果您想要管理授权(用户可以做什么,在您的情况下,用户可以更新什么对象),我建议您查看该模块


它基于安全模块,但基于drools的规则为您提供了所需的所有灵活性。

我将尝试澄清我在问题末尾提出的解决方案,该方案通常可以解决此问题

每个实体将有另一个字段–令牌–由安全密钥签名的实体id。此令牌不必存储在数据库中,但可以动态计算。当呈现编辑页面时,它会在字段中包括签名的id,例如\u at字段:

<input type="hidden" name="user.id" value="123" />
<input type="hidden" name="user.__at" value="9e01f3c8...4ccba38b9" />
<input type="hidden" name="user.address.id" value="124" />
<input type="hidden" name="user.address.__at" value="83df099...4a276fc8" />

当这些实体在控制器中绑定时,它会再次唱出接收到的id,并将其与
\u at
字段进行比较。如果这些签名值不相同,则表示用户已更改id


我不是一个加密专家,也没有看过Play会话是如何签名的,但我想这是类似的。您认为这种机制可以工作吗?

CheckAuthentity只检查真实性令牌,而不检查ID的修改,其目的是防止。你的第二个建议可以解决这个问题,但它需要更多的编码。我正在寻找应用程序范围的解决方案。我在应用程序中已经有了身份验证机制。但这并不能解决问题。用户可以免费注册,甚至经过身份验证的用户也可以更改
User.id
参数,从而编辑其他用户的条目。我试图找到一个通用的解决方案,您可以一次编辑多个实体并验证其所有id。是的,我想授权用户将我交给他的同一个对象(即同一id)发回给我进行编辑。当然,我可以在
save()
方法中检查bind User对象实际上是允许用户编辑的对象。但是如果我想一次绑定并保存一个完整的实体图,我必须遍历该图并检查每个实体。每个表单和
save()
方法都需要进行此检查。我正在寻找更通用的解决方案,我将尝试在回答中描述它。这也不会起作用,因为在第一次保存调用之后,hibernate cascade save/update将不会调用playframework保存!在这种情况下,您可以使用调用安全权限模块的hibernate eventListener。
<input type="hidden" name="user.id" value="123" />
<input type="hidden" name="user.__at" value="9e01f3c8...4ccba38b9" />
<input type="hidden" name="user.address.id" value="124" />
<input type="hidden" name="user.address.__at" value="83df099...4a276fc8" />