2012-01-11 15 views
52

Ho due applicazioni.Come utilizzare le autorizzazioni personalizzate in Android?

Uno sta dichiarando il permesso e aver singola Activity:

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

La seconda dichiara che si utilizza il permesso

Parte della AndroidManifest.xml

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

<application 

Parte di 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"))); 
} 

Sto installando il permesso dichiarando applicazione, quindi ho eseguito la seconda applicazione.

In un risultato che ottengo un'eccezione di sicurezza:

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

Voglio solo sottolineare questa vulnerabilità: http://commonsware.com/blog/2014/02/12/vulnerabilities-custom-permissions.html – Tobrun

+0

Per quanto riguarda il commento di vulnerabilità sopra riportato, notare le modifiche in Android 5.0 che indirizzo questo problema: http://developer.android.com/about/versions/android-5.0-changes.html#custom_permissions – Nonos

risposta

98

ho creato un codice di prova si può utilizzare e testare le autorizzazioni . Esistono due applicazioni PermissionTestClient che dichiara il permesso e protegge la sua attività con questa autorizzazione. Ecco il file manifest:

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

Non c'è nulla di speciale nel file di attività, quindi non lo mostrerò qui.

L'applicazione PermissionTestServer chiama l'attività da PermissionTestClient.Qui è il suo file manifesto:

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

E Attività:

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

per testarlo è sufficiente rimuovere usi-autorizzazione di applicazione server. Otterrai un errore di violazione della sicurezza.

+2

Grazie, il mio errore è stato quello di mettere l'attributo 'permesso' solo all'elemento' '. – pixel

+0

Questo non funziona per me quando utilizzo android: protectionLevel = "signature" in PermissionTestClient, utilizzo l'autorizzazione su quell'app launcher e ottengo: Permission Denial: starting Intent {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10000000 cmp = my.package.foobar/.DashboardActivity} da null (pid = 4070, uid = 2000) richiede my.custom.permission.ACCESS_ACTIVITY - quindi l'app non riesce a lanciare la propria attività 0_o – fr1550n

+2

Il livello di autorizzazione della firma significa che il tuo client e server devono essere firmati con lo stesso certificato. Prova ad avviare il codice usando il livello pericoloso e se tutto è a posto, prova a lanciare con la firma. Un'altra cosa, se usi la firma, penso che tu debba esportare un file apk firmato e poi installarlo. – Yury

29

È necessario creare un permesso di manifestare la vostra applicazione di base per dichiarandolo esclusivamente. Per esempio:

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

E poi fare uso di esso nella vostra applicazione desiderata come:

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

Nota:E 'fondamentale per mantenere l'ordine in cui si installano le applicazioni con autorizzazioni personalizzate . È necessario installare l'app prima che dichiara il permesso e successivamente installa quello che ne fa uso. Qualsiasi interruzione in questo ordine può rompere l'utilizzo di personalizzato. autorizzazioni.

+0

Conciso e breve e funziona. La risposta più votata è migliore, ma questo è esattamente ciò che è stato chiesto nella domanda. Una nota, questo è TUTTO il necessario per usare permessi personalizzati, perché il responsabile della sicurezza si prende cura di tutto il resto. – PSIXO

+0

Non riesco a farlo funzionare, anche quando dichiaro autorizzazioni di utilizzo nell'app che ha creato l'autorizzazione. Alza l'eccezione di sicurezza all'inizio – Anshu

+1

Finché non ricordo male, anche l'ordine di installazione delle app è importante. Innanzitutto installa l'app che dichiara l'autorizzazione personalizzata e quindi installa l'app che utilizza tale autorizzazione personalizzata. – waqaslam

0

Definizione un'autorizzazione personalizzata viene effettuata utilizzando <Permission> tag .. Segui il link qui sotto per utilizzare le autorizzazioni definite dall'utente in applicazione:

Declaring and Enforcing Permissions

1

Come indicato nelle risposte, è necessario prendere in considerazione anche l'ordine di installazione delle app.

Questo è importante perché:

se l'App che richiede l'autorizzazione (App B) sia installato prima l'App che definisce il permesso (App A), allora non ci sarà tale autorizzazione definito nel dispositivo specifico quindi il sistema operativo non chiederà il permesso a tutti.

Successivamente, quando si installa l'App A e si tenta di eseguire l'App B, quest'ultimo non riuscirà ad accedere al componente protetto.

Una soluzione potrebbe essere quella di definire la stessa autorizzazione personalizzato in entrambe le applicazioni, A e B, al fine di assicurarsi che il permesso esiste nel dispositivo, indipendentemente da quale app è installato per primo, in modo che quando è installato l'App A, il il permesso sarà già concesso a App B.

in questo caso, però, è necessario assicurarsi che il livello di protezione è lo stesso in entrambi i dichiarazioni, perché questo può portare a rischio la sicurezza .

(si noti che da Android 5.0 e su non è possibile definire la stessa autorizzazione in più di un'app, tranne quando tali app sono firmate con la stessa chiave di firma).

Problemi correlati