2012-08-31 98 views
7

我沒有找到一個帖子,要求與我一樣的限制。限制訪問內容提供商

我有一個應用程序向其他應用程序(稱之爲客戶端應用程序)提供內容提供者(稱爲主應用程序)。我想限制客戶端應用程序對內容提供者的訪問,以便僅支持插入和可能查詢方法。

我不想要什麼:

  • 使內容供應商的私密,因爲主要目標是提供一個數據庫客戶端應用程序。
  • 限制客戶端應用程序的簽名訪問,因爲任何人都必須能夠編寫使用主應用程序平臺的客戶端應用程序。

我看到的最明顯的解決方案是編寫兩個內容提供者,一個擁有主應用程序的完全訪問權限,另一個受限制的公共權限。但我認爲這絕對不是一個正確的方法。

根據這個Google groups post,我想在內容提供者調用中使用Binder.getCallingUid()來檢測這個調用是否來自主應用程序。所以我不能在更新刪除方法,如果調用不來自主應用程序。

我怎麼能得到主要應用程序UID比較?如果有可能,這個解決方案是否安全?

感謝您的建議。

+0

如果我理解正確,包含內容提供程序組件的應用程序應該是唯一具有寫入權限的應用程序。那麼爲什麼不通過Content Provider接口使用該功能呢?在這種情況下,內容提供者只會支持查詢接口。 – Sameer

+0

不幸的是,客戶端應用程序所需的主要訪問權限是插入。所以他們也需要寫訪問權限。但是你是對的,主應用程序不需要使用內容提供者,但它會增加太多的複雜性和可維護性。 – FabiF

+0

好,還是一樣的一點。主應用程序可以直接插入,更新和刪除,而無需通過Content Provider界面。 Content Provider只提供插入和查詢接口。 – Sameer

回答

8

定義像的ProtectionLevel在下面簽字的權限,這個寫權限將僅限於它們與相同的私鑰

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

並檢查您的軟件包名稱是否存在於此列表中。我認爲它是安全的

+0

我知道這個解決方案,但在我的情況下,客戶端應用程序必須能夠*插入*數據,所以他們還需要具有寫入權限。 – FabiF

+0

你想限制什麼?只有幾個客戶端應用程序通過packagename? – nandeesh

+0

如果您的應用程序需要通過sqlitedbhelper執行數據並通過contentprovider減少訪問數 – nandeesh