2012-08-31 22 views
7

No he encontrado una publicación que solicite la misma restricción que yo.Restringir el acceso al proveedor de contenido

Tengo una aplicación que proporciona un proveedor de contenido (llámalo aplicación principal) a otras aplicaciones (llámalas aplicaciones de cliente). Quiero restringir el acceso al proveedor de contenido desde las aplicaciones del cliente para admitir solo los insertar y quizás consultar métodos.

Lo que no quiero:

  • hacer que el proveedor de contenido privado ya que el objetivo principal es proporcionar una base de datos a las aplicaciones cliente.
  • Restrinja el acceso con las firmas de las aplicaciones cliente porque cualquiera debe poder escribir una aplicación cliente que use la plataforma principal de la aplicación.

La solución más obvia que veo es escribir dos proveedores de contenido, uno con acceso completo privado de la aplicación principal y un público restringido. Pero creo que definitivamente esta no es una forma adecuada.

De acuerdo con este Google groups post, estoy pensando en utilizar Binder.getCallingUid() en las llamadas al proveedor de contenido para detectar si la llamada proviene de la aplicación principal o no. Así que no puedo hacer nada en actualización y eliminar los métodos si la llamada no proviene de la aplicación principal.

¿Cómo puedo obtener la aplicación principal UID para comparar? Y si es posible, ¿esta solución es segura?

Gracias por su consejo.

+0

Si entiendo correctamente, la aplicación que contiene el componente proveedor de contenido debe ser la única que tenga acceso de escritura. ¿Por qué no puede usar esa funcionalidad sin pasar por la interfaz del proveedor de contenido? En ese caso, el proveedor de contenido solo admitiría la interfaz de consulta. – Sameer

+0

Desafortunadamente, el acceso principal que necesitan las aplicaciones cliente es la inserción. Entonces también necesitan tener acceso de escritura. Pero tiene razón, la aplicación principal no está obligada a usar el proveedor de contenido, pero aumentará la complejidad y la facilidad de mantenimiento. – FabiF

+0

bien, sigue el mismo punto.la aplicación principal puede hacer inserciones, actualizaciones y eliminaciones directamente sin pasar por la interfaz del proveedor de contenido. El proveedor de contenido solo proporciona una interfaz de inserción y consulta. – Sameer

Respuesta

8

Definir un permiso, como a continuación con ProtectionLevel firma, este permiso de escritura se limita sólo a las aplicaciones que se firman con la clave privada misma

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

Luego, en el uso de etiquetas ContentProvider leer y escribir etiquetas de permisos. Usted puede cumplir permiso de lectura o en conjunto podría eliminarlo

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

Así que sólo las aplicaciones que están firmadas por misma firma puede usar su proveedor de contenidos

Editar:

tal vez usted podría utilizar este

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

Y compruebe si su nombre de paquete está presente en esta lista. Creo que es seguro

+0

Conozco esta solución, pero en mi caso, las aplicaciones cliente tienen que poder * insertar * datos, por lo que también necesitan tener acceso de escritura. – FabiF

+0

¿Qué es lo que quiere restringir? solo algunas aplicaciones de cliente por nombre de paquete? – nandeesh

+0

si su propia aplicación necesita los datos, hágalo a través de sqlitedbhelper y dé acceso reducido a través del proveedor de contenido – nandeesh

Cuestiones relacionadas