- Android開發(fā)精要
- 范懷宇
- 1823字
- 2018-12-31 16:22:02
3.6.1 權(quán)限配置
Android的權(quán)限系統(tǒng),是Android整體安全體系的一部分。在配置文件中,應用可以定義第三方訪問其中的組件和資源所需要的權(quán)限,并設(shè)置在特定的組件或方法上。同時,應用也可以通過配置文件聲明其所需權(quán)限,以訪問其他應用或系統(tǒng)中的受限資源。這些權(quán)限聲明會在應用安裝時告知用戶,用戶可以根據(jù)這些信息決定是否要安裝該應用。
圖3-17所示的權(quán)限配置,包含權(quán)限的定義和權(quán)限使用聲明兩部分內(nèi)容。應用需要使用的權(quán)限,需要通過配置項<user-permission>來聲明。比如,如果應用需要讀取聯(lián)系人記錄,就需要在配置文件中添加權(quán)限使用聲明:
<user-permission android:name="android.permission.READ_CONTACTS" />
Android的權(quán)限驗證是基于整個應用的。也就是說,只要應用在配置文件中聲明使用該權(quán)限,整個應用中任意組件的任何一行代碼就都可以訪問該權(quán)限保護下的資源。應用對權(quán)限的使用聲明會在應用安裝時展示給用戶。因此,開發(fā)者不應在應用中聲明不需要的權(quán)限,否則,用戶可能會因為這條權(quán)限聲明而放棄安裝應用,那就得不償失了。
如果開發(fā)者需要定義權(quán)限來限制第三方應用的訪問,則可以通過<permission>配置項來進行定義,示例如下:
<permission
android:name="com.duguhome.test.permission.SAMPLE" android:label="權(quán)限的名字"
android:description="權(quán)限的具體描述"
android:permissionGroup=
" android.permission-group.COST_MONEY"
android:protectionLevel="normal" />
權(quán)限定義中的標簽(android:label)和描述(android:description)會展示給用戶看,因此需要使用用戶可理解的語句(而不是開發(fā)者的術(shù)語)進行描述。而權(quán)限的分組,則是為了以更好的結(jié)構(gòu)向用戶展示權(quán)限,使用戶能夠更清楚地理解。比如,該示例權(quán)限的分組是android.permission-group.COST_MONEY,則該分組下的權(quán)限都是提示用戶該應用可能會消耗通信費用。如果系統(tǒng)中沒有預定義符合該權(quán)限的分組,也可以通過配置項<permission-group>自行定義。
定義了的權(quán)限還需要部署到對應的組件上才能生效(如圖3-18所示)。組件管理服務在構(gòu)造一個組件對象時,會校驗請求組件的權(quán)限聲明是否與該組件的權(quán)限配置相匹配(如果請求組件和實現(xiàn)組件位于同一應用,無需進行檢查),如果匹配失敗,會拋出異常阻止這次調(diào)用。Android的權(quán)限體系沒有傳遞性,進行權(quán)限比較時僅有調(diào)用組件和實現(xiàn)組件參與。比如A組件使用了權(quán)限1,并定義了權(quán)限2,B組件需要使用A組件時,僅需要聲明使用權(quán)限2即可,和權(quán)限1再無關(guān)聯(lián)。

圖3-18 Android權(quán)限的定義和使用聲明
基于組件部署權(quán)限約束粒度過大,并不能適用于所有的應用場景,尤其是與服務組件綁定并進行通信的時候。一個服務組件提供的接口中,可能有些涉及關(guān)鍵資源的使用,而另一些并非如此,用組件級別的權(quán)限進行約束顯得過于簡單和粗暴,會增加服務組件被使用的難度。因此在Android中,權(quán)限也可以不事先部署在組件上,而是在運行時調(diào)用Context.checkPermission函數(shù)動態(tài)校驗。比如,很多服務都會對讀操作開放而對寫操作約束權(quán)限。這就需要在所有寫操作相關(guān)的綁定接口處,調(diào)用Context. checkPermission進行校驗。
Android的權(quán)限體系,需要組件使用者事先知曉被使用組件的權(quán)限狀況。這是一種單向的權(quán)責關(guān)系,不適合處理雙向組件交互的場景。比如,郵件應用可能會封裝一個數(shù)據(jù)源組件,用來向第三方應用提供郵件內(nèi)容信息。由于郵件信息比較私密,被讀取時應該讓用戶知曉,郵件應用就需要定義權(quán)限限制對數(shù)據(jù)源組件的調(diào)用。但如果郵件應用主動調(diào)用第三方組件來展示郵件中的相關(guān)內(nèi)容(比如附件中的圖片),就會出現(xiàn)權(quán)限死鎖的狀況—被調(diào)用的組件需要從數(shù)據(jù)源中讀取郵件信息,但它并不能提前知曉并聲明對數(shù)據(jù)源的使用權(quán)限,從而構(gòu)成了一個無法解開的死鎖。
為了打破這樣的死鎖, Android為數(shù)據(jù)源組件特別部署了權(quán)限赦免機制。當郵件應用調(diào)用第三方組件展示郵件內(nèi)容時,可以在Intent對象的標志位(flag)中,添加Intent.FLAG_GRANT_READ_URI_PERMISSION等權(quán)限赦免相關(guān)的標志位,臨時允許這個被調(diào)用的組件跳過權(quán)限約束,直接訪問特定URI路徑下的資源信息,從而解開這個權(quán)限死鎖。
對于大部分應用而言,定義并部署權(quán)限必須謹慎。因為Android是一個開放的系統(tǒng),應用各組件之間彼此獨立。而自定義的權(quán)限為了增加組件間的耦合性,則需要使用者明確知曉所有被調(diào)用組件的權(quán)限信息,限制了組件調(diào)用的靈活性。
小貼士
權(quán)限系統(tǒng)僅屬于Android安全體系的一部分,除此之外,Android為了保障用戶不受惡意應用的侵擾,還部署了其他相關(guān)的系統(tǒng)。
1) 應用數(shù)據(jù)的私有性。Android會為每個應用開設(shè)一個獨立的Linux用戶賬號,它們有自己獨立的Home目錄,不能相互讀寫對方的文件信息(除非獲取了root權(quán)限)。利用Linux本身的權(quán)限機制,Android實現(xiàn)了應用數(shù)據(jù)的私有化,保障了數(shù)據(jù)的安全性。
2) 應用的簽名機制。Android的應用,是用其定義的Java包名來區(qū)分的,雖然Java包名有其命名規(guī)范,具有很好的辨識度,但并不能保證不同應用間沒有重名。而當系統(tǒng)安裝了兩個同包名的應用時,會允許后來者覆蓋前者,這給了惡意應用可乘之機。因此,Android引入了簽名機制,開發(fā)者可以為它的應用進行簽名,簽了名的應用就相當于設(shè)置了超高保密度的密碼,僅當應用包名和簽名同時一致時,才允許被覆蓋安裝。
- Visual Basic .NET程序設(shè)計(第3版)
- Spring Cloud Alibaba微服務架構(gòu)設(shè)計與開發(fā)實戰(zhàn)
- Building a Home Security System with Raspberry Pi
- C++ Builder 6.0下OpenGL編程技術(shù)
- C/C++算法從菜鳥到達人
- Groovy for Domain:specific Languages(Second Edition)
- MariaDB High Performance
- 深入淺出Serverless:技術(shù)原理與應用實踐
- Apache Spark 2.x for Java Developers
- Mastering Business Intelligence with MicroStrategy
- 計算機應用基礎(chǔ)教程(Windows 7+Office 2010)
- Android嵌入式系統(tǒng)程序開發(fā):基于Cortex-A8(第2版)
- 平面設(shè)計經(jīng)典案例教程:CorelDRAW X6
- Natural Language Processing with Python Quick Start Guide
- 嵌入式Linux C語言程序設(shè)計基礎(chǔ)教程