Biasanya, saya menempatkan keputusan otorisasi di pengontrol sisi server saya. Ini telah menjadi titik akhir yang tenang baru-baru ini, tapi saya pikir singkatan yang sama untuk arsitektur tipe MVC. Demi argumen, anggaplah itu otorisasi berdasarkan peran. Metode yang dilindungi akan diberi catatan atau melakukan pemeriksaan dan mengembalikan 403 jika perlu.
Sekarang, mengingat bahwa otorisasi sebenarnya adalah aturan bisnis - "hanya administrator yang dapat mencantumkan X" misalnya, saya pikir mereka harus didorong ke bawah. Ketika pengontrol meminta lapisan bisnis untuk melakukan operasi, lapisan layanan atau bisnis memberi tahu pengontrol itu tidak sah.
Apakah ini pendekatan yang masuk akal? Apakah ada kerugian untuk ini?
Saya enggan memiliki AuthorisationService yang pada dasarnya memiliki banyak aturan kode prosedural statis untuk melakukan ini, tetapi mungkin masuk akal untuk menjaga semua logika akses di satu tempat. Apakah ini merupakan masalah lintas sektoral yang harus dipisahkan?
Jadi saya bertanya apakah ada yang telah melakukan ini dan bagaimana mereka mencapainya dengan cara yang bersih atau jika ada sumber daya bagus yang bisa saya baca. Saya menggunakan Java fwiw tapi ini pertanyaan agnostik bahasa.
Saya telah memeriksa pertanyaan terkait di sini dan mereka sangat tipis di tanah dan jawabannya. Misalnya: Validasi dan Otorisasi dalam Model Domain dan Membawa itu melalui Lapisan Layanan ke MVC
Saya membaca dokumen keamanan musim semi yang membuat beberapa argumen yang baik untuk itu menjadi perhatian lintas sektoral, tapi saya khawatir itu hanya "jalan semi" dan ingin perspektif yang lebih luas. Ini juga mengikat aplikasi Anda ke kerangka kerja tertentu.
sumber
Jawaban:
Praktik yang baik untuk mengekspos hanya opsi yang diizinkan pengguna.
Ini memaksa otorisasi untuk menjadi perhatian lintas sektoral. "Tampilan" perlu tahu apa yang boleh dilakukan pengguna sebelum dapat membangun opsi dan menu untuk ditampilkan.
Bagian belakang tidak boleh mempercayai ujung depan untuk membuat keputusan keamanan sehingga harus memeriksa otorisasi itu sendiri.
Mungkin ada aturan bisnis yang mempengaruhi otorisasi tergantung pada data misalnya "Hanya pengguna dengan saldo lebih dari $ 5.000 yang dapat meminta transfer mata uang asing" atau "Hanya pengguna yang berada di Kantor Pusat yang dapat melihat akun ini". Jadi beberapa logika otorisasi diperlukan dalam logika bisnis.
Ada juga otorisasi Teknis untuk dipertimbangkan - siapa yang diizinkan untuk melihat log, siapa yang dapat membuat cadangan / memulihkan database dll.
Jadi pada akhirnya setiap komponen dalam Anda mungkin memiliki beberapa persyaratan keamanan dan / atau otorisasi tertentu, dalam praktiknya hampir tidak mungkin untuk membungkusnya menjadi "lapisan otorisasi" yang terpisah.
sumber
Saya pikir ini pendekatan yang sangat masuk akal untuk menggunakan otorisasi di lapisan Layanan Anda. Anda perlu melindungi layanan Anda dari melakukan kegiatan yang tidak sah (terutama modifikasi data). Lapisan Layanan Anda dapat berada di satu pustaka, dan digunakan oleh berbagai lapisan Presentasi (Anda bisa memiliki aplikasi UI yang berbeda, yang menggunakan lapisan Layanan yang sama). Dan Anda tidak dapat mengandalkan fakta bahwa lapisan Presentasi tertentu melakukan validasi yang diperlukan. Ini sangat penting jika Anda akan memutuskan untuk memindahkan lapisan Layanan Anda ke proses yang terpisah (misalnya mengikuti pendekatan SOA).
Sekarang tentang bagaimana mencapai ini dengan "cara bersih". Saya tidak suka gagasan membuang sampah sembarangan logika bisnis dengan cek otorisasi, sehingga beberapa implementasi pendekatan berorientasi-pemrograman-aspek tertentu dapat membantu: itu bisa berupa metode layanan dekorasi dengan atribut khusus atau menggunakan proxy dinamis dengan intersepsi.
Dan yang penting, saya harus mengakui bahwa dalam proyek yang sangat sederhana, mungkin, Anda bisa hidup tanpa validasi yang terpisah, hanya untuk menyederhanakan hidup Anda. Namun penting jangan sampai ketinggalan momen ketika "proyek sederhana" mulai menjadi "proyek kompleks".
sumber
Saya suka mendorong cek otorisasi serendah mungkin! (Tapi tidak lebih jauh!)
Anda masih bebas menulis tes otorisasi otomatis terhadap layer "di atas" ini. Dan beberapa aturan mungkin hanya berlaku atau masuk akal di lapisan yang lebih tinggi seperti lapisan layanan Anda (CanView / CanSerialize?). Tapi, saya biasanya berpikir bahwa strategi otorisasi teraman juga adalah strategi "KERING-est": Pertahankan otorisasi serendah mungkin, dalam kode "paling umum" atau "dibagikan" semampu Anda (tanpa terlalu memperumit aturan auth).
Pikirkan alternatifnya. Jika aturan otorisasi Anda diuji dan ditegakkan hanya di lapisan layanan, meninggalkan objek domain Anda yang buruk untuk tunduk pada kehendak objek layanan murung, Anda akan sering diminta untuk menegakkan setiap aturan individu lebih dari sekali, di beberapa objek dan beberapa tempat di setiap objek, dan kode yang lebih rumit.
Selain itu, ketika tim analisis Anda menyewa perusahaan konsultan untuk menulis layanan pelaporan menggunakan objek domain Anda, Anda tidak ingin harus mempercayai pengembang tersebut! (Atau apa pun. Anda membangun layanan tambahan atau memanggil objek yang sama dengan alasan apa pun.) Anda tidak akan ingin membuka kembali buku besar peraturan bisnis dan berharap untuk menegakkan aturan itu dengan benar lagi ; Anda ingin domain Anda sudah mengenal mereka dan menegakkannya.
sumber
Widget
, aturan yang sama berlaku di mana-mana. (Jadi jangan mengambil risiko membiarkan siapa pun mengabaikannya!) Jika aturan itu tidak berlaku di mana-mana, itu bukan aturan tentangWidgets
dan satu - satunyaWidgets
. . Dorong aturan ke bawah sejauh mereka (aturan individu) bisa pergi; tapi, tidak sejauh "aturan" bisa pergi ... Aku merasa seperti aku tidak menyatakan perbedaan dengan baik. Tapi, seharusnya ada perbedaan di sana.