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
      +--------+
4

2 回答 2

5

以下是我对这个话题的看法。没有提供代码,因为我没有实现任何东西。另外,我不完全确定这个解决方案是否完全安全。

首先,认证。

每个想要使用您的内容提供商的客户都需要一个密钥。每个客户端从您的应用程序中获取一个密钥(可能为此实现一个内容提供程序)。字母/数字的随机序列应该没问题。此密钥存储在您的应用程序和客户端应用程序中,其他人无法访问的地方,即私有数据库/首选项属性。

此密钥用于向您的内容提供商验证客户端应用程序。在每个请求中,此密钥(可能是密钥的哈希)包含在请求 uri 中(很像使用 REST Web 服务时的 API 密钥)。您的应用程序会检查之前是否生成了所提供的密钥。如果是这种情况,则身份验证成功。

其次,授权。

数据库中的每个元素都有一个字段ownerKey。创建新元素时,此字段将使用请求提供的键填充。在访问/修改/删除元素时,您的内容提供者应检查存储的密钥是​​否与提交的密钥匹配。仅当键匹配时才执行操作。

额外的想法。

  • 关键是您的应用程序生成的随机密钥保持私密。我不确定第三方是否可以拦截客户端应用程序和内容提供者之间的交互。您可能想在编写任何代码之前对此进行调查。
  • 在每个请求上指定一个键可能是可选的。在元素创建期间省略密钥时,这些元素没有密钥,ownerKey因此任何人都可以在没有身份验证/授权的情况下访问和修改。

我希望这会有所帮助。

于 2013-11-12T10:28:34.070 回答
2

我建议使用 uid 方法,但没有理由间接通过接收器。只需将每一行的拥有 uid 存储在数据库中,并在对内容提供者的传入调用中使用Binder.getCallingUid()来检索当前调用者的 uid,您可以针对他们正在操作的行进行验证。

于 2013-11-12T22:20:41.237 回答