web-dev-qa-db-fra.com

Comment utiliser les autorisations personnalisées dans Android?

J'ai deux applications.

On est en train de déclarer l'autorisation et d'avoir un seul Activity:

Partie de AndroidManifest.xml

<application
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:permission="your.namespace.permission.TEST" >
    <activity
        Android:name=".DeclaringPermissionActivity"
        Android:label="@string/app_name" >

        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter> 
         <action Android:name="Android.intent.action.VIEW" /> 
         <category Android:name="Android.intent.category.DEFAULT" /> 
         <category Android:name="Android.intent.category.BROWSABLE" /> 
         <data Android:scheme="myapp"
             Android:Host="myapp.mycompany.com" /> 
        </intent-filter> 
    </activity>
</application>

Le second déclare qu'il utilise l'autorisation

Partie de AndroidManifest.xml

<uses-sdk Android:minSdkVersion="10" />
<uses-permission Android:name="your.namespace.permission.TEST" />

<application

Partie de Activity:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("myapp://myapp.mycompany.com/index")));
}

J'installe l'application en déclarant l'autorisation, puis je lance la deuxième application.

En conséquence, je reçois une exception de sécurité:

 01-11 09:46:55.249: E/AndroidRuntime(347): Java.lang.RuntimeException: Unable to start activity ComponentInfo{your.namespace2/your.namespace2.UsingPErmissionActivity}: Java.lang.SecurityException: Permission Denial: starting Intent { act=Android.intent.action.VIEW dat=myapp://myapp.mycompany.com/index cmp=your.namespace/.DeclaringPermissionActivity } from ProcessRecord{407842c0 347:your.namespace2/10082} (pid=347, uid=10082) requires your.namespace.permission.TEST
56
pixel

J'ai créé un code de test, vous pouvez l'utiliser et tester vos autorisations. Il existe deux applications PermissionTestClient qui déclarent une autorisation et protègent son activité avec cette autorisation. Voici son fichier manifeste:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.testpackage.permissiontestclient"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk Android:minSdkVersion="10" />
    <permission Android:name="com.testpackage.mypermission" Android:label="my_permission" Android:protectionLevel="dangerous"></permission>

    <application
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name" >
        <activity
            Android:permission="com.testpackage.mypermission"
            Android:name=".PermissionTestClientActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter >
                <action Android:name="com.testpackage.permissiontestclient.MyAction" />
                <category Android:name="Android.intent.category.DEFAULT" />                
            </intent-filter>
        </activity>
    </application>

</manifest>

Il n'y a rien de spécial dans le fichier d'activité, je ne le montrerai donc pas ici.

L'application PermissionTestServer appelle l'activité de PermissionTestClient. Voici son fichier manifeste:

<?xml version="1.0" encoding="utf-8"?>
<uses-sdk Android:minSdkVersion="10" />
<uses-permission Android:name="com.testpackage.mypermission"/>

<application
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name" >
    <activity
        Android:name=".PermissionTestServerActivity"
        Android:label="@string/app_name" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

Et activité:

package com.testpackage.permissiontestserver;

import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;

public class PermissionTestServerActivity extends Activity {
    private static final String TAG = "PermissionTestServerActivity";

    /** Called when the activity is first created. */
    Button btnTest;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btnTest = (Button) findViewById(R.id.btnTest);
        btnTest.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d(TAG, "Button pressed!");
                Intent in = new Intent();
                in.setAction("com.testpackage.permissiontestclient.MyAction");
                in.addCategory("Android.intent.category.DEFAULT");
                startActivity(in);
            }
        });
    }
}

Pour le tester, supprimez simplement uses-permission de l'application serveur. Vous obtiendrez une erreur de violation de sécurité.

102
Yury

Vous devez créer une autorisation dans le manifeste de votre application de base en la déclarant exclusivement. Par exemple:

<permission Android:name="your.namespace.permission.TEST"
    Android:protectionLevel="normal" Android:label="This is my custom  permission" />

Et plus tard, utilisez-le dans votre application souhaitée en tant que:

<uses-permission Android:name="your.namespace.permission.TEST" />

Remarque: Il est essentiel de conserver l'ordre dans lequel vous installez vos applications avec des autorisations personnalisées. C'est-à-dire que vous devez installer cette application première qui déclare l'autorisation, puis installer celle qui en fait usage. Toute interruption dans cet ordre peut empêcher l'utilisation des autorisations personnalisées .

32
waqaslam

Comme indiqué dans les réponses, vous devez également prendre en compte l'ordre d'installation des applications.

c'est important parce que:

si l'application qui demande l'autorisation (Application B) est installée avant l'application qui définit l'autorisation (Application A), il n'y aura aucune autorisation définie de ce type sur le périphérique spécifique, de sorte que le système d'exploitation ne demandera pas l'autorisation du tout.

plus tard, lorsque vous installez l’application A et essayez d’exécuter l’application B, celle-ci ne pourra pas accéder au composant sécurisé.

Une solution de contournement consisterait à définir la même autorisation personnalisée dans les applications A, B et B, afin de vous assurer que l'autorisation existe dans le périphérique, quelle que soit l'application installée en premier. Ainsi, lorsque l'application A sera installée, l'autorisation sera déjà accordé à App B.

Dans ce cas, vous devez toutefois vous assurer que le niveau de protection est le même dans les deux déclarations, car cela peut entraîner risque de sécurité.

(Notez ici que depuis Android 5.0 et plus, vous ne pouvez pas définir la même autorisation dans plusieurs applications, sauf lorsque ces applications sont signées avec la même clé de signature).

3
Adam

La définition de l'autorisation personnalisée est effectuée à l'aide de <Permission> tag .. Veuillez suivre le lien ci-dessous pour utiliser les autorisations définies par l'utilisateur dans l'application:

Déclaration et application des autorisations

1
Lavakush