Saya tidak akan memilih untuk mengucapkan komentar asli seperti yang dikatakan, tetapi mengidentifikasi masalah yang berpotensi sah.
Secara khusus, masalah yang memerlukan pemisahan adalah otentikasi vs otorisasi .
Otentikasi mengacu pada proses masuk dan mendapatkan identitas. Begitulah sistem mengetahui siapa Anda , dan digunakan untuk hal-hal seperti personalisasi, kepemilikan objek, dll.
Otorisasi mengacu pada apa yang Anda boleh lakukan , dan ini (umumnya) tidak ditentukan oleh siapa Anda . Sebaliknya, itu ditentukan oleh beberapa kebijakan keamanan seperti peran atau izin, yang tidak peduli tentang hal-hal seperti nama atau alamat email Anda.
Keduanya dapat berubah secara orthogonal satu sama lain. Misalnya, Anda dapat mengubah model otentikasi dengan menambahkan penyedia OpenID / OpenAuth. Dan Anda dapat mengubah kebijakan keamanan dengan menambahkan peran baru, atau mengubah dari RBAC ke ABAC.
Jika semua ini masuk ke dalam satu kelas atau abstraksi, maka kode keamanan Anda, yang merupakan salah satu alat terpenting Anda untuk mitigasi risiko , ironisnya, berisiko tinggi.
Saya telah bekerja dengan sistem di mana otentikasi dan otorisasi terlalu erat digabungkan. Dalam satu sistem, ada dua database pengguna paralel, masing-masing untuk satu jenis "peran". Orang atau tim yang mendesainnya tampaknya tidak pernah mempertimbangkan bahwa pengguna fisik tunggal mungkin berada di kedua peran, atau bahwa mungkin ada tindakan tertentu yang umum terjadi pada beberapa peran, atau bahwa mungkin ada masalah dengan tabrakan ID Pengguna. Ini adalah contoh yang diakui ekstrem, tetapi sangat menyakitkan untuk dikerjakan.
Microsoft dan Sun / Oracle (Java) merujuk pada agregat informasi otentikasi dan otorisasi sebagai Principal Keamanan . Itu tidak sempurna, tetapi bekerja dengan cukup baik. NET, misalnya, Anda memiliki IPrincipal
, yang merangkum yang IIdentity
- mantan makhluk kebijakan (otorisasi) objek sedangkan yang kedua adalah identitas (otentikasi). Anda bisa mempertanyakan keputusan untuk menempatkan satu di dalam yang lain, tetapi yang penting adalah bahwa sebagian besar kode yang Anda tulis hanya untuk salah satu abstraksi yang berarti mudah untuk menguji dan refactor.
Tidak ada yang salah dengan User.IsAdmin
bidang ... kecuali ada juga User.Name
bidang. Ini akan menunjukkan bahwa konsep "Pengguna" tidak didefinisikan dengan benar dan ini, sayangnya, adalah kesalahan yang sangat umum di kalangan pengembang yang agak basah di belakang telinga ketika datang ke keamanan. Biasanya, satu-satunya hal yang harus dibagikan oleh identitas dan kebijakan adalah ID Pengguna, yang, tidak secara kebetulan, adalah persis bagaimana itu diterapkan di kedua model keamanan Windows dan * nix.
Benar-benar dapat diterima untuk membuat objek pembungkus yang merangkum identitas dan kebijakan. Misalnya, ini akan memfasilitasi pembuatan layar dasbor di mana Anda perlu menampilkan pesan "halo" di samping berbagai widget atau tautan yang diizinkan diakses oleh pengguna saat ini. Selama pembungkus ini hanya membungkus identitas dan informasi kebijakan, dan tidak mengklaim memilikinya. Dengan kata lain, selama itu tidak disajikan sebagai akar agregat .
Model keamanan yang sederhana selalu tampak seperti ide yang bagus ketika Anda pertama kali merancang aplikasi baru, karena YAGNI dan semua itu, tetapi hampir selalu akhirnya kembali menggigit Anda nanti, karena, kejutan yang mengejutkan, fitur baru ditambahkan!
Jadi, jika Anda tahu yang terbaik untuk Anda, Anda akan memisahkan informasi otentikasi dan otorisasi. Sekalipun "otorisasi" saat ini sesederhana bendera "IsAdmin", Anda masih akan lebih baik jika itu bukan bagian dari kelas atau tabel yang sama dengan informasi otentikasi, sehingga jika dan ketika kebijakan keamanan Anda perlu ubah, Anda tidak perlu melakukan operasi rekonstruksi pada sistem otentikasi Anda yang sudah berfungsi dengan baik.