ההרשאות לא משמשות רק לבקשה של פונקציונליות מערכת. אפשר גם להגביל את האופן שבו אפליקציות אחרות יכולות לקיים אינטראקציה עם הרכיבים של האפליקציה.
במדריך הזה נסביר איך לבדוק את קבוצת ההרשאות שאפליקציה אחרת הצהירה עליהן. במדריך מוסבר גם איך להגדיר פעילויות, שירותים, ספקי תוכן ומקלטי שידור כדי להגביל את האופן שבו אפליקציות אחרות יכולות לקיים אינטראקציה עם האפליקציה שלכם.
בדיקת ההרשאות של אפליקציה אחרת
כדי להציג את קבוצת ההרשאות שאפליקציה אחרת מצהירה עליהן, צריך להשתמש במכשיר או במהדר כדי לבצע את השלבים הבאים:
- פותחים את המסך מידע על האפליקציה של האפליקציה הרצויה.
בוחרים באפשרות Permissions. המסך הרשאות לאפליקציות נטען.
במסך הזה מוצגת קבוצה של קבוצות הרשאות. המערכת מארגנת את קבוצות ההרשאות האלה לפי ההרשאות שהאפליקציה הצהירה עליהן.
יש כמה דרכים שימושיות אחרות לבדוק את ההרשאות:
- במהלך קריאה לשירות, מעבירים מחרוזת הרשאה אל
Context.checkCallingPermission()
. השיטה הזו מחזירה מספר שלם שמציין אם ההרשאה הזו הוענקה לתהליך הקריאה החוזרת הנוכחי. שימו לב: אפשר להשתמש באפשרות הזו רק כשמפעילים קריאה שמגיעה מתהליך אחר, בדרך כלל דרך ממשק IDL שפורסם משירות או בדרך אחרת כלשהי שניתנה לתהליך אחר. - כדי לבדוק אם הוקצה הרשאה מסוימת לתהליך אחר, מעבירים את המזהה של התהליך (PID) ל-
Context.checkPermission()
. - כדי לבדוק אם חבילה אחרת קיבלה הרשאה מסוימת, מעבירים את שם החבילה ל-
PackageManager.checkPermission()
.
הגבלת האינטראקציות עם הפעילויות של האפליקציה
כדי להגביל את האפליקציות האחרות שיכולות להפעיל את ה-Activity
הזה, אפשר להשתמש במאפיין android:permission
בתג
<activity>
במניפסט. ההרשאה נבדקת במהלך Context.startActivity()
ו-Activity.startActivityForResult()
.
אם למבצע הקריאה החוזרת אין את ההרשאה הנדרשת, מתרחשת הודעת השגיאה SecurityException
.
הגבלת האינטראקציות עם השירותים של האפליקציה
כדי להגביל את האפליקציות האחרות שיכולות להפעיל או לקשר ל-Service
המשויך, משתמשים במאפיין android:permission
בתג
<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.FLAG_GRANT_READ_URI_PERMISSION
כדי לאפשר לאפליקציה להצגת תמונות לראות את התמונה.
שיקול נוסף הוא החשיפה של האפליקציה. אם האפליקציה שלכם מטרגטת ל-Android 11 (רמת API 30) ומעלה, המערכת הופכת אפליקציות מסוימות לגלויה לאפליקציה באופן אוטומטי ומסתירה אפליקציות אחרות כברירת מחדל. אם לאפליקציה יש ספק תוכן והיא העניקה הרשאות URI לאפליקציה אחרת, האפליקציה גלויה באופן אוטומטי לאפליקציה האחרת.
למידע נוסף, עיינו במסמכי העזרה של השיטות grantUriPermission()
, revokeUriPermission()
ו-checkUriPermission()
.
הגבלת האינטראקציות עם מקלטי השידור של האפליקציה
אפשר להשתמש במאפיין android:permission
בתווית
<receiver>
כדי להגביל את האפליקציות האחרות שיכולות לשלוח שידורים ל-BroadcastReceiver
המשויך.
ההרשאה נבדקת אחרי החזרת הערך של Context.sendBroadcast()
, כי המערכת מנסה להעביר את השידור שנשלח למכשיר המקבל הנתון. המשמעות היא שכשיש כשל בהרשאה, לא מתבצעת הטלת חריגה חזרה למבצע הקריאה החוזרת – פשוט לא מועבר הערך של Intent
.
באותו אופן, אפשר לספק הרשאה ל-Context.registerReceiver()
כדי לקבוע לאילו אפליקציות אחרות תהיה אפשרות לשדר למקלט שנרשם באופן פרוגרמטי. לחלופין, אפשר לספק הרשאה בזמן הקריאה ל-Context.sendBroadcast()
כדי להגביל את מקבלי השידור שיכולים לקבל את השידור.
חשוב לזכור שגם המקבל וגם המבצע יכולים לדרוש הרשאה. במקרה כזה, שתי בדיקות ההרשאות צריכות לעבור כדי שהכוונה תישלח ליעד המשויך. מידע נוסף זמין במאמר הגבלת שידורים באמצעות הרשאות.