限制对内容提供商的访问

时间:2012-08-31 09:35:28

标签: android android-contentprovider

我没有找到一个要求与我相同限制的帖子。

我有一个应用程序,它向其他应用程序(称为客户端应用程序)提供内容提供程序(称之为主应用程序)。我想限制从客户端应用程序访问内容提供程序,仅支持 insert 查询方法。

我不想要的东西:

  • 使内容提供商保密,因为主要目标是为客户端应用程序提供数据库。
  • 使用客户端应用程序的签名限制访问权限,因为任何人都必须能够编写使用主应用程序平台的客户端应用程序。

我看到的最明显的解决方案是编写两个内容提供程序,一个具有主应用程序的完全访问权限,另一个受限公共。但我认为这绝对不是一种正确的方法。

根据这个Google groups post,我想在内容提供商调用中使用Binder.getCallingUid()来检测调用是否来自主应用程序。因此,如果调用不是来自主应用程序,我无法在更新删除方法中执行任何操作。

如何让主应用程序 UID 进行比较?如果有可能,这个解决方案是否安全?

感谢您的建议。

1 个答案:

答案 0 :(得分:8)

使用protectionLevel签名定义如下所示的权限,此WRITE权限仅限于使用相同私钥签名的应用

<permission android:name="com.yourapp.WRITE.PERMISSION"
    android:protectionLevel="signature"
        android:label="@string/permission_label"
        android:description="@string/permission_desc">
</permission>

<permission android:name="com.yourapp.READ.PERMISSION"
        android:label="@string/permission_label"
        android:description="@string/permission_desc">
</permission>

然后在contentprovider标签中使用读写权限标签。 您可以强制执行读取权限,也可以将其全部删除

android:readPermission="com.yourapp.READ.PERMISSION"
android:writePermission="com.yourapp.WRITE.PERMISSION"

因此,只有使用相同签名签名的应用才能使用您的内容提供商

编辑:

也许你可以使用这个

 private Collection<String> getCallingPackages() {
     int caller = Binder.getCallingUid();
     if (caller == 0) {
         return null;
     }
     return Lists.newArrayList(mContext.getPackageManager().getPackagesForUid(caller));
 }

并检查此列表中是否包含您的包名称。我认为这是安全的