Restringir el acceso al proveedor de contenido
No encontré un post que pida la misma restricción que yo.
Tengo una aplicación que proporciona un proveedor de contenido (llamarlo aplicación principal) a otras aplicaciones (llamarlos aplicaciones cliente). Quiero restringir el acceso al proveedor de contenido de las aplicaciones cliente para apoyar sólo el insertar y tal vez métodos de consulta .
- IllegalStateException "intenta volver a abrir un objeto ya cerrado" en SimpleCursorAdapter de ContentProvider
- ¿Por qué ContentValues tiene un método put que admite booleanos?
- Cómo cargar un URI con el prefijo "content: //" usando Glide Android?
- Compartir imágenes desde el almacenamiento interno mediante FileProvider
- Crear y compartir un archivo desde el almacenamiento interno
Lo que no quiero:
- Hacer el proveedor de contenido privado porque el objetivo principal es proporcionar una base de datos a las aplicaciones cliente.
- Restringir el acceso con las firmas de las aplicaciones cliente, ya que cualquier persona debe ser capaz de escribir una aplicación cliente que utilizan la plataforma de aplicación principal.
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 esto definitivamente no es una manera apropiada.
De acuerdo con este post de grupos de Google , estoy pensando en usar Binder.getCallingUid()
en las llamadas del proveedor de contenido para detectar si la llamada proviene de la aplicación principal o no. Así que no puedo hacer nada en los métodos de actualización y eliminación si la llamada no proviene de la aplicación principal.
¿Cómo puedo obtener el UID de la aplicación principal para comparar? Y si es posible, ¿esta solución es segura?
Gracias por su consejo.
- Quién puede mostrar más proveedores con ACTION_OPEN_DOCUMENT
- El orden de instalar la aplicación está cambiando el comportamiento?
- Deshabilitar notificaciones en un URI de ContentProvider
- Buena manera de almacenar datos en caché durante el ciclo de vida de las aplicaciones de Android?
- Insertar varias filas con ContentProvider
- SelectionArgs in ContentResolver.query (...) puede ser una subconsulta?
- ¿Cuál es el sustituto adecuado de "managedQuery" obsoleta?
- Android múltiples proveedores de contenido, (DLC)
Defina un permiso como el siguiente con la firma protectionLevel, este permiso WRITE se restringirá a sólo las aplicaciones que están firmadas con la misma clave privada
<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 la etiqueta contentprovider, utilice etiquetas de permisos de lectura y escritura. Puede aplicar el permiso de lectura o puede eliminarlo por completo
android:readPermission="com.yourapp.READ.PERMISSION" android:writePermission="com.yourapp.WRITE.PERMISSION"
Por lo tanto, sólo las aplicaciones que están firmadas por la misma firma pueden utilizar su proveedor de contenido
Editar:
Tal vez podrías usar esto
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
- Cómo crear una nueva lista de reproducción con ContentResolver
- El permiso ACCESS_MOCK_LOCATION se ignora?