Jika saya mengerti AccessController.doPrivileged benar, itu mengatakan bahwa kode yang tidak dipercaya harus dapat memanggil metode yang membutuhkan izin (seperti System.getProperty()
) melalui metode antara itu tidak memiliki izin.
Itu menimbulkan pertanyaan: kapan seharusnya AccessController.doPrivileged()
digunakan? Kapan kode tidak tepercaya diizinkan untuk mengaktifkan kode privileged melalui metode intermediate? Kapan seharusnya gagal?
Mengikuti alasan Anda, tolong jelaskan mengapa pembuatan ClassLoader harus selalu diizinkan: http://findbugs.sourceforge.net/bugDescriptions.html#DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED
Setuju dengan Jawaban Suraj, tetapi saya pikir saya akan menambahkan contoh spesifik di mana saya telah meminta penggunaan blok istimewa.
Bayangkan Anda telah membangun sebuah aplikasi yang menyediakan sejumlah layanan ke modul yang bisa di-pluggable. Jadi aplikasi Anda dan layanannya adalah kode tepercaya. Modul yang dapat dicolok, bagaimanapun, tidak selalu dipercaya dan dimuat dalam kelas loader mereka sendiri (dan memiliki domain perlindungan mereka sendiri).
Ketika modul yang dapat di-pluggable memanggil sebuah layanan, Anda menerapkan pemeriksaan keamanan kustom ("modul X yang dapat pluggable memiliki izin untuk menggunakan layanan ini"). Tapi layanan itu sendiri mungkin memerlukan beberapa izin inti Java (baca properti sistem, menulis ke file, dll). Kode yang membutuhkan izin ini dibungkus dalam doPrivileged()
sehingga perizinan yang tidak memadai dari modul pluggable yang tidak tepercaya diabaikan secara efektif - hanya hak istimewa dari modul layanan tepercaya Anda yang berlaku.
Pada dasarnya, AccessController.doPriviledged () setara dengan file set-user-id. Ini mengatakan "Saya dengan ini meminta metode ini dilakukan dengan hak istimewa saya, bahkan jika saya dipanggil dengan metode yang tidak memilikinya."
Periksa tautan ini dan gulir ke bawah untuk menggunakan API doPrivileged.
Java 6:
http://docs.oracle.com/javase/6/docs/technotes/guides/security/doprivileged.html
Java 7:
http://docs.oracle.com/javase/7/docs/technotes/guides/security/doprivileged.html
Ketika metode pemeriksa akses AccessController dipanggil oleh penelepon terbaru, algoritma dasar untuk memutuskan apakah membolehkan atau menolak akses yang diminta adalah sebagai berikut:
Jika kode untuk penelepon apa pun dalam rantai panggilan tidak memiliki izin yang diminta, AccessControlException dilemparkan, kecuali hal berikut ini benar - penelepon yang kodenya diberi izin tersebut telah ditandai sebagai "istimewa" (lihat di bawah) dan semua pihak kemudian dipanggil oleh penelepon ini (langsung atau tidak langsung) semua memiliki izin kata