如何仅授予URI创建者权限

3
我有一个应用程序,叫做ApplicationProvider,它包含一个提供者和一个接收器。另一个应用程序,称为ApplicationCreator,通过意图在提供者上创建一个元素。ApplicationProvider获取意图并相应地创建元素。
现在我希望ApplicationCreator是唯一拥有访问该元素的权利。因此,如果其他应用程序尝试访问该元素,则会生成某种错误。
最好的方法是什么?我想到了两种可能的解决方案,但我都不喜欢。
1)ApplicationProvider拒绝直接访问提供程序,而是使用接收器获取通过intentForResult发送的意图,因此接收器可以检查调用者,验证是创建元素的原始调用者并授予权限。其他应用程序将被拒绝,因为它们具有不同的UID。由于没有简单的方法来伪造UID,因此该系统有效。
2)任何应用程序都可以向提供程序发送意图,但在清单中,我指定所有路径级别权限到创建的单个URI。每当有人想要创建新元素时,我手动向应用程序发出更新。
附加信息:
如果不同的应用程序可以放置不同的元素并能够保留修改他们创建的这些元素的权利,并且还可以授予请求该权限的人对这些元素的权限,那就太理想了。
A---> +--------+            A creates content
      |   pro  | <---B      B asks permission
A<----|   vid  |            the provider forward permission
A---->|   er   |            A grant permission
      |        | --->B      B is given permission and can access A's stuff
      +--------+

其他应用程序是否应该能够使用ApplicationProvider并创建不同的元素? - ozbek
请查看我在问题中的更新。 - gurghet
"...并授予权限给请求该权限的元素。"很不幸,我无法理解您的陈述意图。您能否请更具体一些? - user656588
应用程序B想要修改应用程序A的元素,因此它向应用程序A发出请求,但该元素位于提供者上。 - gurghet
2个回答

5
以下是我对这个主题的看法。没有提供任何代码,因为我没有实现任何东西。此外,我不确定这个解决方案是否完全安全。
首先,认证。
每个想要使用您的内容提供程序的客户端都需要一个密钥。每个客户端从您的应用程序中获取一个密钥(可以实现一个内容提供程序来完成这个过程)。一串随机的字母/数字应该就可以了。该密钥存储在您的应用程序和客户端应用程序中的某个位置,只有您和客户端才能访问,即私有数据库/偏好属性。
该密钥用于验证客户端应用程序与您的内容提供程序之间的身份验证。在每个请求中,该密钥(可能是密钥的哈希)包含在请求URI中(就像在使用REST Web服务时使用API密钥一样)。您的应用程序检查是否先前生成了提供的密钥。如果是这种情况,则身份验证成功。
接下来,授权。
您的数据库中的每个元素都有一个字段“ownerKey”。创建新元素时,该字段填充为请求中提供的密钥。在访问/修改/删除元素时,您的内容提供程序应检查存储的密钥是否与提交的密钥匹配。仅在密钥匹配时执行操作。
其他想法。
- 整个重点在于您的应用程序生成的随机密钥保持私有。我不确定第三方是否可以拦截客户端应用程序和内容提供程序之间的交互。在编写任何代码之前,您可能需要调查一下。 - 每个请求中指定一个密钥是可选的。在元素创建过程中省略密钥时,这些元素没有“ownerKey”,因此允许任何人在未经身份验证/授权的情况下访问和修改它们。
希望这对您有所帮助。

谢谢Jonas,这个答案真的很有启发性。我可能会接受它! - gurghet

2
我建议采用uid方法,但没有理由让它通过接收器间接传递。只需在数据库中为每行存储所属uid,在调用内容提供程序时使用Binder.getCallingUid()来检索当前调用者的uid,并将其与他们正在操作的行进行验证。

我考虑过这个问题,但是没有办法验证是否有另一个来自同一供应商的具有相同ID的应用程序。 - gurghet
1
我在想UID方法有多安全,因为如果创建条目的原始应用程序被卸载,UID是否会被重复使用? - Flow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接