Ada banyak pertanyaan di sini yang berhubungan dengan mekanisme otentikasi dan otorisasi API ISTIRAHAT tetapi tidak satupun dari mereka tampaknya masuk ke detail tentang bagaimana menerapkan layanan aman di tingkat aplikasi.
Sebagai contoh, misalkan webapp saya (saya ingat Java tetapi ini berlaku untuk backend mana pun) memiliki sistem otentikasi aman yang memungkinkan pengguna API untuk login dengan nama pengguna dan kata sandi. Ketika pengguna membuat permintaan, pada titik mana pun selama permintaan memproses pipa saya bisa memanggil getAuthenticatedUser()
metode yang akan mengembalikan pengguna nol jika pengguna tidak masuk, atau objek domain pengguna yang mewakili pengguna yang masuk.
API memungkinkan pengguna terotentikasi untuk mengakses data mereka, mis. GET untuk /api/orders/
akan mengembalikan daftar pesanan pengguna tersebut. Demikian pula, GET untuk /api/tasks/{task_id}
akan mengembalikan data yang berkaitan dengan tugas tertentu.
Mari kita asumsikan bahwa ada sejumlah objek domain berbeda yang dapat dikaitkan dengan akun pengguna (pesanan dan tugas adalah dua contoh, kami juga dapat memiliki pelanggan, faktur, dll.). Kami hanya ingin pengguna yang diautentikasi dapat mengakses data tentang objek mereka sendiri sehingga ketika pengguna melakukan panggilan ke /api/invoices/{invoice_id}
kami perlu memeriksa bahwa pengguna berwenang untuk mengakses sumber daya itu sebelum kami menyajikannya.
Pertanyaan saya adalah, apakah ada pola atau strategi untuk menangani masalah otorisasi ini? Salah satu opsi yang saya pertimbangkan adalah membuat antarmuka pembantu (yaitu SecurityUtils.isUserAuthorized(user, object)
), yang dapat dipanggil selama pemrosesan permintaan untuk memastikan bahwa pengguna berwenang untuk mengambil objek. Ini tidak ideal karena mencemari kode titik akhir aplikasi dengan banyak panggilan ini, mis
Object someEndpoint(int objectId) {
if (!SecurityUtils.isUserAuthorized(loggedInUser, objectDAO.get(objectId)) {
throw new UnauthorizedException();
}
...
}
... dan kemudian ada pertanyaan tentang penerapan metode ini untuk setiap jenis domain yang bisa sedikit menyebalkan. Ini mungkin satu-satunya pilihan tetapi saya tertarik mendengar saran Anda!