2012-01-11 17 views
52

मेरे पास दो अनुप्रयोग हैं।एंड्रॉइड में कस्टम अनुमतियों का उपयोग कैसे करें?

एक अनुमति घोषित करने और एकल Activity रहा है:

के भाग 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> 

दूसरा है घोषणा करता है कि अनुमति का उपयोग करता

के भाग AndroidManifest.xml

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

<application 

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

मैं आवेदन की घोषणा की अनुमति स्थापित करने कर रहा हूँ, तो मैं दूसरे एप्लिकेशन को चलाने के।

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

मैं सिर्फ इस भेद्यता को इंगित करना चाहता हूं: http://commonsware.com/blog/2014/02/12/vulnerabilities-custom-permissions.html – Tobrun

+0

उपरोक्त भेद्यता टिप्पणी के बारे में, एंड्रॉइड 5.0 में परिवर्तनों को ध्यान में रखें यह समस्या: http://developer.android.com/about/versions/android-5.0-changes.html#custom_permissions – Nonos

उत्तर

98

मैं एक परीक्षण कोड आप इसका इस्तेमाल करने और अपने अनुमतियों परीक्षण कर सकते हैं बनाया । अनुमतियाँटेस्ट क्लाइंट दो एप्लिकेशन हैं जो अनुमति की घोषणा करते हैं और इस अनुमति के साथ अपनी गतिविधि की सुरक्षा करते हैं। यहां इसकी मेनिफेस्ट फ़ाइल है:

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

गतिविधि फ़ाइल में कुछ खास नहीं है इसलिए मैं इसे यहां नहीं दिखाऊंगा।

PermissionTestServer एप्लिकेशन PermissionTestClient से गतिविधि कॉल करता है।

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

और गतिविधि::

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

यह परीक्षण करने के लिए सिर्फ सर्वर आवेदन से उपयोग करता है-अनुमति को दूर यहाँ अपने मैनिफ़ेस्ट फ़ाइल है। आपको सुरक्षा उल्लंघन त्रुटि मिलेगी।

+2

धन्यवाद, मेरी गलती केवल '' तत्व पर 'अनुमति' विशेषता डालना था। – pixel

+0

जब मैं एंड्रॉइड का उपयोग करता हूं तो यह मेरे लिए काम नहीं करता है: PermensionTestClient में securityLevel = "हस्ताक्षर", मैं उस ऐप लॉन्चर पर अनुमति का उपयोग करता हूं और प्राप्त करता हूं: अनुमति अस्वीकार: प्रारंभिक कार्य {act = android।intent.action.MAIN बिल्ली = [android.intent.category.LAUNCHER] flg = 0x10000000 cmp = my.package.foobar /.dashboardActivity} शून्य से (pid = 4070, uid = 2000) के लिए my.custom.permission.ACCESS_ACTIVITY की आवश्यकता है - इसलिए ऐप अपनी गतिविधि लॉन्च करने में विफल रहता है 0_o – fr1550n

+2

अनुमति के हस्ताक्षर स्तर का अर्थ है कि आपके क्लाइंट और सर्वर को उसी प्रमाणपत्र के साथ हस्ताक्षर किया जाना चाहिए। खतरनाक स्तर का उपयोग कर कोड लॉन्च करने का प्रयास करें और यदि सब कुछ ठीक है, तो हस्ताक्षर के साथ लॉन्च करने का प्रयास करें। एक और बात, यदि आप हस्ताक्षर का उपयोग करते हैं तो मुझे लगता है कि आपको एक हस्ताक्षरित एपीके फाइलों को निर्यात करने की आवश्यकता है और फिर उन्हें इंस्टॉल करें। – Yury

29

आप यह विशेष रूप से की घोषणा के द्वारा अपने आधार ऐप की मेनिफेस्ट में एक अनुमति बनाने की जरूरत:

एक परिणाम में मैं सुरक्षा अपवाद मिलता है। उदाहरण के लिए:

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

और बाद में के रूप में अपने वांछित अनुप्रयोग में यह का इस्तेमाल करते हैं:

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

नोट:यह जिसमें आप कस्टम अनुमतियों के साथ अपने अनुप्रयोग स्थापित व्यवस्था बनाए रखने के लिए महत्वपूर्ण है । यानी आपको उस ऐप को पहले इंस्टॉल करने की आवश्यकता होगी जो अनुमति की घोषणा करता है और बाद में इसका उपयोग करता है जो इसका उपयोग करता है। इस आदेश में कोई भी व्यवधान कस्टम के उपयोग को तोड़ सकता है। अनुमतियां।

+0

संक्षिप्त और संक्षिप्त और यह काम करता है। शीर्ष वोट दिया गया जवाब बेहतर है लेकिन सवाल में यही पूछा गया था। एक नोट, आप सभी को कस्टम अनुमतियों का उपयोग करने की आवश्यकता है, क्योंकि सुरक्षा प्रबंधक बाकी की देखभाल करता है। – PSIXO

+0

मैं इसे काम पर नहीं ला सकता, भले ही मैं अनुमति बनाने वाले ऐप में उपयोग-अनुमति घोषित करता हूं। यह – Anshu

+1

की शुरुआत में सुरक्षा अपवाद फेंकता है जब तक मुझे सही याद है, जिस क्रम में आप ऐप्स इंस्टॉल करते हैं, वह भी मायने रखता है। सबसे पहले ऐप इंस्टॉल करें जो कस्टम अनुमति की घोषणा करता है और उसके बाद उस ऐप को इंस्टॉल करता है जो उस कस्टम अनुमति का उपयोग करता है। – waqaslam

0

कस्टम अनुमति को परिभाषित करना <Permission> टैग .. का उपयोग किया जाता आवेदन में उपयोगकर्ता परिभाषित अनुमतियों का उपयोग करने नीचे दिए गए लिंक का पालन करें:

Declaring and Enforcing Permissions

1

जैसा कि उत्तर में बताया गया है, आपको यह भी ध्यान में रखना चाहिए कि आप ऐप्स इंस्टॉल करते हैं।

इस

महत्वपूर्ण है क्योंकि:

यदि अनुप्रयोग है कि अनुमति का अनुरोध किया (एप्लिकेशन बी) अनुप्रयोग है कि अनुमति (एप्लिकेशन ए) को परिभाषित करता है से पहले स्थापित किया गया है, तो विशिष्ट डिवाइस में ऐसी कोई परिभाषित अनुमति होगी तो ओएस बिल्कुल अनुमति नहीं मांगेगा।

बाद में, जब आप ऐप ए इंस्टॉल करते हैं और ऐप बी चलाने की कोशिश करते हैं, तो बाद वाले सुरक्षित घटक तक पहुंचने में विफल रहेगा।

एक वर्कअराउंड यह सुनिश्चित करने के लिए डिवाइस में अनुमति मौजूद है कि डिवाइस में अनुमति मौजूद है, तो ऐप ए इंस्टॉल होने पर, डिवाइस पर अनुमति मौजूद है, तो एक वर्कअराउंड दोनों एप्स, ए और बी में एक ही कस्टम अनुमति को परिभाषित करना होगा, अनुमति पहले से ही हालांकि अनुप्रयोग बी

को प्रदान किया जाएगा कि मामले में, आप यह सुनिश्चित करें कि सुरक्षा स्तर एक ही दोनों घोषणाओं में है क्योंकि इस सुरक्षा जोखिम को जन्म दे सकता बनाना चाहिए।

(यहां ध्यान दें कि एंड्रॉइड 5.0 से और आप एक से अधिक ऐप में एक ही अनुमति को परिभाषित नहीं कर सकते हैं, सिवाय इसके कि उन ऐप्स को एक ही हस्ताक्षर कुंजी के साथ हस्ताक्षरित किया गया हो)।

संबंधित मुद्दे