مشخصات مقاله
-
3072
-
0.0
-
13293
-
0
-
0
آموزش مجوزها (Premission) در اندروید استودیو
آموزش مبحث امنیت و مجوزهای دسترسی در اندروید (Security&Permission)
آموزش مفهوم امنیت در اندروید
سیستم اندروید به هنگام نصب یک اپلیکیشن بر روی دستگاه، یک GID (شناسه ی یکتا که به گروه کاربری خاص تخصیص می یابد) و UID (شناسه ی یگانه ی کاربری) به آن اپلیکیشن اختصاص می دهد. در واقع تمامی فایل های یک آپلیکیشن در انحصار این کاربر یا به اصطلاح private هستند و به تبع دیگر اپلیکیشن ها اجازه ی دسترسی به این فایل ها را ندارند. علاوه بر آن، هر اپلیکیشن اندروید تحت فرایند اختصاصی خود اجرا و راه اندازی می شود. از اینرو، به واسطه ی این ویژگی هسته ی Linux، هر اپلیکیشن اندرویدی از دیگر برنامه های کاربردی در حال اجرا کاملا مستقل و مجزا است. در صورتی هم که یک اپلیکیشن اندروید می بایست بر حسب نیاز اطلاعاتی را با یک اپلیکیشن دیگر رد و بدل کرده و آن ها را به اشتراک بگذارد، این اتفاق بایستی به صورت صریح و توسط یک کامپوننت نرم افزاری که وظیفه ی آن انتقال داده می باشد همچون یک service یا content provider صورت گیرد.
آموزش مفهوم مجوزهای دسترسی در اندروید
اندروید از یک سیستم تخصیص مجوز برخوردار است که ویژه ی هر task یا عملیات مجوزها و سطوح دسترسی خاصی معین می کند. در حقیقت هر اپلیکیشن می تواند جهت انجام عملیات خاص، مجوزهای لازم را از این سامانه درخواست نماید. برای مثال، یک برنامه ی کاربری می تواند از سیستم تخصیص مجوز، درخواست دسترسی به اینترنت را داشته باشد.
سیستم مزبور سطوح مختلفی برای مجوزها دارد که به آن در اصطلاح protection level گفته می شود.
لازم به توضیح است که مفهوم مجوز از کتابخانه های اندروید، نسخه ی 23 (API level) تغییر کرده است. قبل از ویرایش مذکور، یک اپلیکیشن حین نصب مجوزهای مورد نیاز و درخواست خود را به کاربر اعلان می کرد. اما از API 23 به بعد دیگر تنها در زمان اجرای برنامه مجوزهای لازم را از کاربر درخواست می کند.
اپلیکیشن های اندروید مجوزهای مورد نیاز خود را در فایل تنظیمات اندروید (manifest) اعلان می کنند. البته اپلیکیشن می تواند مجوزهای اضافی در این فایل تعریف کند که دسترسی به برخی کامپوننت های نرم افزار را محدود می سازند.
آموزش سیستم مدیریت و تخصیص مجوز در اندروید پیش از API 23
قبل از ویرایش 23 کتابخانه های اندروید، مجوزهای مورد نیاز قبل از نصب اپلیکیشن از کاربر درخواست می شدند. کاربر تصمیم می گرفت که آیا مجوزهای مربوطه باید به برنامه داده شوند یا خیر. چنانچه کاربر مجوز مورد درخواست اپلیکیشن را تایید نمی کرد، در آن صورت اپلیکیشن مورد نظر به هیچ وجه بر روی دستگاه نصب نمی شد. اگر مجوز لازم را حین نصب به اپلیکیشن می داد، اپلیکیشن به بخش های مد نظر خود دسترسی پیدا می کرد و دیگر کاربر نمی توانست این امر را (پس از اتمام نصب برنامه) تغییر دهد.
آموزش سیستم تخصیص مجوز از API 23 به بعد (اعطای مجوز به هنگام اجرا برنامه)
ویرایش 6.0 سیستم عامل اندروید، Marshmallow، یک permission model جدید را معرفی کرد که طی آن مجوزهای لازم، در زمان اجرای اپلیکیشن از کاربر درخواست می شود. بنابراین اگر اپلیکیشنی که در دست توسعه دارید، ویژه ی این نسخه طراحی شده (targetsdkversion آن را بر روی 23 تنظیم کرده اید)، لازم است از مدل تخصیص مجوز جدید استفاده نمایید.
در اندروید دو سطح دسترسی و امنیت به شرح زیر تعریف شده است:
- Normal: در این سطح، مجوزهایی درخواست می شود که به اطلاعات، فایل ها شخصی کاربر یا فعالیت و عملیات دیگر اپلیکیشن ها لطمه ای وارد نمی کند (به بخش های حساس دسترسی ندارد). به عنوان مثال می توان به مجوز تنظیم منطقه ی زمانی اشاره کرد. مجوزهایی که در این سطح هستند معمولا به صورت خودکار به اپلیکیشن اعطا می شوند.
- Dangerous: مجوزهای مربوط به این سطح، اغلب با اطلاعات شخصی کاربر سروکار دارند و حتی ممکن است این اطلاعات یا فرایندهای مربوط به اپلیکیشن های دیگر را دستکاری کنند. به عنوان مثال می توان به اجازه ی دسترسی به اطلاعات مخاطبین کاربر اشاره کرد. این دست از مجوزها باید در زمان اجرای اپلیکیشن از کاربر درخواست می شوند.
برای بررسی اینکه آیا مجوز خاصی به اپلیکیشن داده شده یا خیر، می توان از متد checkSelfPermission استفاده نمود.
// called in a standard activity, use ContextCompat.checkSelfPermission for AppCompActivity
int permissionCheck = checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR);
if (!permissionCheck == PackageManager.PERMISSION_GRANTED) {
// User may have declined earlier, ask Android if we should show him a reason
if (shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.WRITE_CALENDAR)) {
// show an explanation to the user
// Good practise: don't block thread after the user sees the explanation, try again to request the permission.
} else {
// request the permission.
// CALLBACK_NUMBER is a integer constants
requestPermissions(thisActivity, new String[]{Manifest.permission.WRITE_CALENDAR}, CALLBACK_NUMBER);
// The callback method gets the result of the request.
}
} else {
// got permission use it
}
هنگامی که از کاربر درخواست اعطای مجوز می شود، شما یک callback دریافت می کنید.
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, do your work....
} else {
// permission denied
// Disable the functionality that depends on this permission.
}
return;
}
// other 'case' statements for other permssions
}
}