2012-08-31 20 views
7

Aynı kısıtlamayı bana soran bir yayın bulamadım.İçerik sağlayıcısına erişimi kısıtlayın

Bir içerik sağlayıcısını (ana uygulama olarak adlandırın) diğer uygulamalara (istemci uygulamaları olarak adlandırın) sağlayan bir uygulamam var. İstemci uygulamalarından yalnızca insert ve belki sorgu yöntemlerini desteklemek için içerik sağlayıcısına erişimi kısıtlamak istiyorum.

istemiyorum Ne: ana hedefi istemci uygulamaları için bir veritabanı sağlamaktır çünkü

  • içerik sağlayıcı özel yapın.
  • Erişimi, istemci uygulamalarının imzalarıyla kısıtlayın, çünkü herkes ana uygulama platformunu kullanan bir istemci uygulaması yazabilmelidir.

Gördüğüm en belirgin çözüm, biri ana uygulamaya özel tam erişimi olan ve biri kısıtlı olan iki içerik sağlayıcısı yazmaktır. Ama bence bu kesinlikle uygun bir yol değil.

Bu Google groups post uyarınca, arama sağlayıcısı ana uygulamadan gelip gelmediğini algılamak için içerik sağlayıcı çağrılarında Binder.getCallingUid() kullanmayı düşünüyorum. Bu nedenle, çağrı ana uygulamadan gelmiyorsa numaralı güncelleştirme ve yöntemlerinde hiçbir şey yapamam.

Karşılaştırmak için ana uygulama UID nasıl alabilirim? Ve eğer mümkünse, bu çözüm güvenli midir?

Tavsiyeniz için teşekkürler.

+0

Doğru bir şekilde anlıyorsam, içerik sağlayıcı bileşenini içeren uygulama, yazma erişimi olan tek kişi olmalıdır. Bu nedenle, İçerik Sağlayıcı arayüzünden geçmeden bu işlevselliği kullanamaz mı? Bu durumda İçerik sağlayıcı sadece sorgu arayüzünü destekleyecektir. – Sameer

+0

Maalesef, istemci uygulamalarının ihtiyaç duyduğu ana erişim ekleme. Bu yüzden yazma erişimine de sahip olmaları gerekiyor. Ancak haklısınız, ana uygulama içerik sağlayıcısını kullanmak için gerekli değildir, ancak çok fazla karmaşıklık ve süreklilik artacaktır. Yine aynı noktada – FabiF

+0

.Ana uygulama, İçerik Sağlayıcı arayüzünü kullanmadan doğrudan ekleyebilir, güncelleyebilir ve siler. İçerik Sağlayıcı sadece ekleme ve sorgulama arayüzü sağlar. – Sameer

cevap

8

aşağıda ProtectionLevel imzası ile böyle bir izni tanımlayın, bu YAZIN izni Sonra okumak ve izin etiketleri yazmak ContentProvider etiketi kullanımda aynı özel anahtar

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

ile imzalanır yalnızca uygulamalara sınırlı olacaktır. Ya uygulamak izni okuyabilir veya tümüyle o

düzenleyin içerik sağlayıcı kullanabilirsiniz aynı imza ile imzalanmış

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

Yani sadece uygulamaları kaldırmak olabilir:

Belki bu

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

Ve bu pakette paketgenizin olup olmadığını kontrol edin. Güvende olduğunu düşünüyorum

+0

Bu çözümün farkındayım, fakat benim durumumda, istemci uygulamalarının * veri * ekleyebilmeleri, böylece yazma erişimine sahip olmaları gerekiyor. – FabiF

+0

o zaman ne kısıtlamak istiyorsunuz? packagename tarafından sadece birkaç istemci uygulamaları? – nandeesh

+0

Kendi uygulamanızın veriye ihtiyacı varsa, bunu sqlitedbhelper aracılığıyla yapın ve contentprovider – nandeesh