Seringkali apa yang ditampilkan kepada pengguna (misalnya pada halaman web) sebagian didasarkan pada pemeriksaan keamanan. Saya biasanya menganggap keamanan tingkat pengguna / ACL sebagai bagian dari logika bisnis suatu sistem. Jika tampilan secara eksplisit memeriksa keamanan untuk menampilkan elemen UI secara kondisional, apakah itu melanggar MVC dengan mengandung logika bisnis?
10
Jawaban:
Ada dua jenis persyaratan keamanan, satu pada model dan satu lagi pada tampilan. Tampilan mengontrol tampilan elemen yang relevan tergantung pada izin pengguna saat ini, tetapi model mengontrol akses ke data yang mendasarinya. Selama model memiliki semua verifikasi / validasi yang tepat, maka bahkan jika tampilan kurang, masih ada keamanan.
Biasanya Anda harus memiliki keduanya, karena tampilan perlu diubah untuk berbagai level / peran. Pengontrol mengirimkan data yang relevan yang akan mengubah tampilan, tetapi tampilan masih perlu melakukan sesuatu dengan data itu untuk menyembunyikan / menampilkan konten ke pengguna yang tepat.
Itulah sebabnya sebagian besar kerangka kerja templating memiliki elemen bersyarat ( contoh Setang ):
Jadi itu berarti itu bukan pelanggaran, asalkan potongan yang sesuai berada di tempat yang benar.
sumber
Iya dan tidak.
Jika keputusan keamanan yang sebenarnya dibuat oleh pandangan, maka ya, Anda melanggar MVC. Namun, jika tampilan mendelegasikan keputusan aktual untuk model, maka Anda baik-baik saja. Tidak ada yang salah dengan pandangan membuat keputusan tentang elemen mana yang akan ditampilkan, berdasarkan informasi dari model.
Misalnya, jika Anda memiliki tombol "edit" yang hanya dapat dilihat oleh pengguna dengan izin "editor", maka tidak apa-apa bagi pandangan untuk menanyakan model siapa pengguna saat ini dan apakah mereka memiliki izin "editor", lalu menggunakan informasi ini untuk memutuskan apakah akan menampilkan tombol atau tidak. Namun, jika pandangan itu untuk melakukan logika otentikasi dan otorisasi itu sendiri, maka Anda akan melanggar MVC.
sumber
Saya akan mengatakan tidak .
Tetapi untuk alasan yang berbeda dari @rvcoutinho berkata (meskipun dia mengutip wikipedia yang membuat saya merasa salah dalam pemikiran saya)
Saya akan mengatakan masalah keamanan yang relevan harus dibagikan oleh Model yang diberikan kepada tampilan (tergantung pada jumlah kombinasi Anda mungkin ingin menggunakan ViewModel untuk alasan ini), di mana Anda bisa memiliki sakelar untuk bit keamanan.
Hal ini memungkinkan validasi keamanan dua lapisan: pada lapisan UI sehingga postback ditumbangkan untuk kasus normal, serta pada lapisan server untuk aktor jahat di mana model mempertahankan pengetahuan keamanan di dalam dirinya sendiri sehingga pengontrol menyerahkan info ke model yang segera membuangnya.
Keamanan dua lapis seperti ini adalah standar dalam industri, dan cara ini memungkinkan logika keamanan Anda hanya perlu ada di dua tempat jadi itu bonus, segera setelah Anda memasukkan logika keamanan di controller Anda, Anda meletakkannya di sana, dan di UI dan dalam model (model membutuhkannya karena ini adalah garis pertahanan terakhir dan terutama penting untuk penggunaan di luar aplikasi web MVC seperti klien desktop atau alat manajemen server apa pun)
sumber
Saya akan mengatakan tidak .
Biasanya, pemeriksaan keamanan semacam ini akan dilakukan oleh pengontrol.
Dari Wikipedia :
Dan saya tidak berpikir itu harus dilakukan secara langsung di tampilan. Jika itu dilakukan melalui javascript, misalnya, itu bisa menjadi masalah keamanan (orang bisa menonaktifkan javascript dan mengakses data privilleged).
Lagi, dari Wikipedia :
sumber
Ada beberapa masalah yang terlibat dalam pertanyaan ini.
if model.userCanEdit() ... endif
.sumber
Jika hanya tentang menampilkan elemen UI, saya pikir tidak apa-apa (bagaimana lagi yang akan Anda lakukan?). Jika ada data dalam elemen-elemen itu, model harus memastikan bahwa wadahnya kosong. Dan tentu saja kode untuk mendapatkan data izin seharusnya sudah ditangani sebelum tampilan, jadi tidak ada akses aktif ke model di sini.
sumber
Ya, ini merupakan pelanggaran MVC.
Tampilan ada hanya untuk menampilkan elemen, dan logikanya harus dalam model. Dengan memiliki pandangan melakukan sesuatu (dalam kasus Anda, periksa keamanan), Anda menempatkan logika di sana.
sumber