ההרשאות לא משמשות רק לבקשת פונקציונליות של המערכת. אפשר גם להגביל את האינטראקציה של אפליקציות אחרות עם הרכיבים של האפליקציה שלכם.
במדריך הזה מוסבר איך לבדוק את קבוצת ההרשאות שאפליקציה אחרת הצהירה עליהן. במדריך מוסבר גם איך אפשר להגדיר פעילויות, שירותים, ספקי תוכן ומקלטי שידורים כדי להגביל את האופן שבו אפליקציות אחרות יכולות ליצור אינטראקציה עם האפליקציה שלכם.
בדיקת ההרשאות של אפליקציה אחרת
כדי לראות את קבוצת ההרשאות שאפליקציה אחרת מצהירה עליהן, משתמשים במכשיר או באמולטור כדי לבצע את השלבים הבאים:
- פותחים את המסך פרטי האפליקציה של האפליקציה.
לוחצים על הרשאות. המסך הרשאות הניתנות לאפליקציה נטען.
במסך הזה מוצגות קבוצות של הרשאות. המערכת מארגנת את קבוצת ההרשאות שהאפליקציה הצהירה עליהן בקבוצות האלה.
יש עוד כמה דרכים שימושיות לבדיקת הרשאות:
- כדי לבדוק הרשאה במהלך שיחה לשירות, מעבירים מחרוזת הרשאה אל
Context.checkCallingPermission(). השיטה הזו מחזירה מספר שלם שמציין אם ההרשאה הזו ניתנה לתהליך הנוכחי של הקריאה. שימו לב: אפשר להשתמש בשיטה הזו רק כשמבצעים קריאה שמגיעה מתהליך אחר, בדרך כלל דרך ממשק IDL שפורסם משירות או בדרך אחרת שניתנה לתהליך אחר. - כדי לבדוק אם תהליך אחר קיבל הרשאה מסוימת, צריך להעביר את מזהה התהליך (PID) אל
Context.checkPermission(). - כדי לבדוק אם חבילה אחרת קיבלה הרשאה מסוימת, צריך להעביר את שם החבילה אל
PackageManager.checkPermission().
הגבלת האינטראקציות עם הפעילויות באפליקציה
במניפסט, משתמשים במאפיין android:permission של התג <activity> כדי להגביל את האפליקציות האחרות שיכולות להפעיל את Activity הזה. ההרשאה נבדקת במהלך Context.startActivity() וActivity.startActivityForResult(). אם למתקשר אין את ההרשאה הנדרשת, מתרחשת שגיאה SecurityException.
הגבלת האינטראקציות עם השירותים של האפליקציה
בקובץ המניפסט, משתמשים במאפיין android:permission של התג <service> כדי להגביל את האפליקציות האחרות שיכולות להפעיל את Service המשויך או להתחבר אליו. ההרשאה נבדקת במהלך Context.startService(), Context.stopService() ו-Context.bindService(). אם למתקשר אין את ההרשאה הנדרשת, מתרחשת שגיאה SecurityException.
הגבלת האינטראקציות עם ספקי התוכן של האפליקציה
במניפסט, משתמשים במאפיין android:permission של התג <provider> כדי להגביל את האפליקציות האחרות שיכולות לגשת לנתונים ב-ContentProvider.
(לספקי תוכן יש אמצעי אבטחה חשוב נוסף שזמין להם שנקרא הרשאות URI, והוא מתואר בקטע הבא).
בניגוד לרכיבים אחרים, יש שני מאפייני הרשאה נפרדים שאפשר להגדיר לספקי תוכן: android:readPermission מגביל את האפליקציות האחרות שיכולות לקרוא מהספק, ו-android:writePermission מגביל את האפליקציות האחרות שיכולות לכתוב לספק. שימו לב: אם ספק מוגן בהרשאת קריאה ובהרשאת כתיבה, החזקה רק בהרשאת הכתיבה לא מאפשרת לאפליקציה לקרוא מספק.
ההרשאות נבדקות כשמאחזרים את הספק בפעם הראשונה וכשאפליקציה מבצעת פעולות בספק. אם לאפליקציה ששולחת את הבקשה אין את אחת מההרשאות האלה, מתרחשת שגיאה SecurityException. כדי להשתמש ב-ContentResolver.query() נדרשת הרשאת קריאה, וכדי להשתמש ב-ContentResolver.insert(), ContentResolver.update() או ContentResolver.delete() נדרשת הרשאת כתיבה. בכל המקרים האלה, אם אין לכם את ההרשאה הנדרשת, תופיע השגיאה SecurityException.
מתן גישה על בסיס URI
המערכת מספקת לכם שליטה נוספת ומפורטת יותר באופן שבו אפליקציות אחרות יכולות לגשת לספקי התוכן של האפליקציה שלכם. בפרט, ספק התוכן יכול להגן על עצמו באמצעות הרשאות קריאה וכתיבה, ועדיין לאפשר ללקוחות הישירים שלו לשתף כתובות URI ספציפיות עם אפליקציות אחרות. כדי להצהיר שהאפליקציה תומכת במודל הזה, צריך להשתמש במאפיין android:grantUriPermissions או באלמנט <grant-uri-permission>.
אפשר גם להעניק הרשאות לכל URI בנפרד. כשמתחילים פעילות או מחזירים תוצאה לפעילות, צריך להגדיר את דגל הכוונה Intent.FLAG_GRANT_READ_URI_PERMISSION, את דגל הכוונה Intent.FLAG_GRANT_WRITE_URI_PERMISSION או את שני הדגלים. כך ניתנות לאפליקציות אחרות הרשאות קריאה, כתיבה או קריאה וכתיבה, בהתאם, ל-URI של הנתונים שכלול ב-Intent. אפליקציות אחרות מקבלות את ההרשאות האלה עבור מזהה ה-URI הספציפי, בלי קשר לשאלה אם יש להן הרשאה לגשת לנתונים בספק התוכן באופן כללי יותר.
לדוגמה, נניח שמשתמש משתמש באפליקציה שלכם כדי לצפות באימייל עם קובץ מצורף של תמונה. באופן כללי, לאפליקציות אחרות אין גישה לתוכן של האימייל, אבל יכול להיות שהן ירצו לראות את התמונה. האפליקציה יכולה להשתמש ב-intent ובדגל ה-intent Intent.FLAG_GRANT_READ_URI_PERMISSION כדי לאפשר לאפליקציה לצפייה בתמונות לראות את התמונה.
שיקול נוסף הוא ניראות האפליקציה. אם האפליקציה שלכם מטרגטת ל-Android 11 (API ברמה 30) ומעלה, המערכת הופכת חלק מהאפליקציות לגלויות לאפליקציה שלכם באופן אוטומטי ומסתירה אפליקציות אחרות כברירת מחדל. אם לאפליקציה שלכם יש ספק תוכן והיא העניקה הרשאות URI לאפליקציה אחרת, האפליקציה שלכם גלויה באופן אוטומטי לאפליקציה האחרת.
למידע נוסף, אפשר לעיין בחומר העזר של השיטות grantUriPermission(), revokeUriPermission() ו-checkUriPermission().
הגבלת האינטראקציות עם מקלטי השידורים של האפליקציה
משתמשים במאפיין android:permission של התג <receiver> כדי להגביל את האפליקציות האחרות שיכולות לשלוח שידורים אל BroadcastReceiver המשויך. המערכת בודקת את ההרשאה אחרי שהפונקציה Context.sendBroadcast() מחזירה ערך, כי המערכת מנסה להעביר את השידור שנשלח אל המקלט שצוין. המשמעות היא ששגיאת הרשאה לא גורמת להחזרת חריגה למבצע הקריאה – היא פשוט לא מעבירה את Intent.
אפשר גם להגדיר הרשאות באופן פרוגרמטי:
- כדי לקבוע לאילו אפליקציות אחרות תהיה אפשרות לשדר למקלט שרשום באופן פרוגרמטי: צריך לספק הרשאה ל-
Context.registerReceiver(). - כדי להגביל את מקלטי השידור שיכולים לקבל שידור: צריך לספק הרשאה כשמתקשרים אל
Context.sendBroadcast().
שימו לב שגם המקבל וגם המשדר יכולים לדרוש הרשאה. במקרה כזה, שתי בדיקות ההרשאות צריכות לעבור כדי שהכוונה תועבר ליעד המשויך. מידע נוסף זמין במאמר בנושא הגבלת שידורים באמצעות הרשאות.