9

私と同じ制限を求める投稿は見つかりませんでした。

コンテンツ プロバイダー (メイン アプリケーションと呼びます) を他のアプリケーション (クライアント アプリケーションと呼びます) に提供するアプリケーションがあります。クライアント アプリケーションからコンテンツ プロバイダーへのアクセスを制限して、挿入メソッドとおそらくクエリメソッドのみをサポートしたいと考えています。

私が望まないもの:

  • 主な目的はクライアント アプリケーションにデータベースを提供することであるため、コンテンツ プロバイダーをプライベートにします。
  • メイン アプリケーション プラットフォームを使用するクライアント アプリケーションは誰でも作成できる必要があるため、クライアント アプリケーションのシグネチャでアクセスを制限します。

私が考える最も明白な解決策は、2 つのコンテンツ プロバイダーを作成することです。しかし、これは間違いなく適切な方法ではないと思います。

このGoogleグループの投稿Binder.getCallingUid()によると、コンテンツプロバイダーの呼び出しで使用して、呼び出しがメインアプリケーションからのものかどうかを検出することを考えています。そのため、呼び出しがメイン アプリケーションからのものでない場合、updateメソッドとdeleteメソッドでは何もできません。

比較するメイン アプリケーションのUIDを取得するにはどうすればよいですか? 可能であれば、このソリューションは安全ですか?

アドバイスありがとうございます。

4

1 に答える 1

9

以下のようなアクセス許可を 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 タグで read および write パーミッション タグを使用します。読み取り許可を強制するか、完全に削除することができます

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));
 }

そして、パッケージ名がこのリストに存在するかどうかを確認してください。安全だと思います

于 2012-08-31T09:56:44.617 に答える