Di mana penerapan aturan otorisasi untuk aplikasi berlapis saya?


8

Pertanyaan ini tentang penerapan aturan aplikasi saya yang membingungkan saya.

Pengontrol saya menggunakan layanan dan layanan menggunakan repositori.

public class CommentController: ApiController{

    [HttpPost]
    public bool EditComment(Comment comment){
        commentService.Update(comment);
    }
}

public class CommentService{
    ICommentRepository repository;
    ....
    ....
    public void Update(Comment comment){
        repository.Update(comment);
    }
}

Jika pengguna diautentikasi, ia dapat memperbarui komentar.

  • Tetapi pengguna harus mengedit komentar sendiri.

  • Tetapi seorang admin dapat mengedit semua komentar.

  • Tetapi komentar tidak dapat diedit setelah tanggal yang ditentukan.

  • Edit oleh departemen

Dan saya punya sesuatu seperti aturan ini.

Jika saya menerapkan aturan "komentar pengguna mengedit sendiri" di lapisan layanan, saya akan mengubah methot pembaruan dan melewati parameter pengontrol pengguna. Identitas. Nama,

public class CommentService{
    ICommentRepository repository;
    ....
    ....
    public void Update(string updatedByThisUser, Comment comment){
        // if updatedByThisUser is owner of comment
        repository.Update(comment);
    }
}

Tapi, apakah benar mengubah operasi layanan dengan aturan?

Saya sedikit bingung tentang di mana saya bisa menerapkan aturan. Di controller atau dalam layanan atau di repositori.

Apakah ada cara standar untuk melakukan ini seperti pola desain.


Dalam pengalaman saya, selalu baik untuk menerapkan otorisasi di tingkat Pengendali. Anda akan menempatkan atribut otorisasi di atas nama kelas Controller seperti: [Authorize(Roles="member, admin")]dan sekarang semua metode tindakan di Controller hanya dapat diakses oleh pengguna dalam peran "anggota" atau "admin".
Alternatex

1
Tapi, jika saya perlu menggunakan layanan saya pada proyek desktop dan proyek situs web MVC, saya harus menerapkan aturan otorisasi semua proyek lagi.
barteloma

Jawaban:


1

saya akan

  • buat PermissionService terpisah yang mengimplementasikan metode seperti isUserAllowedTo(user, PermissionService.Permissiontype.Update, PermissionService.Topic.COMMENT, additionalContextRelevantParameters)
  • dan panggil PermissionServicemetode dalam pengontrol, di mana info konteks yang diperlukan (yaitu dari sesi) tersedia.

Anda dapat mendesain arsitektur Anda untuk memanggil layanan izin di CommentService. Tetapi saya tidak akan merekomendasikan ini karena ini akan menambah dependensi tambahan ke dalam layanan (yaitu sesi) yang membuat unit-pengujian layanan jauh lebih sulit


1

Pertama, luangkan waktu untuk mempertimbangkan apa yang sebenarnya bertanggung jawab atas layanan komentar. Ini akan tergantung pada persyaratan spesifik Anda, dan mungkin bahkan penilaian terbaik Anda sendiri.

Jika tanggung jawab layanan komentar terbatas pada memperbarui komentar yang diberikan , maka apa yang Anda tulis baik-baik saja. Dalam hal ini, Anda perlu mempertimbangkan beberapa logika kondisional lainnya untuk memeriksa apakah komentar yang diberikan dapat diperbarui. Anda mungkin akan melakukan ini di controller, atau Anda dapat membuat sub sistem terpisah untuk memeriksa apakah Pengguna dapat memposting komentar. Anda dapat menggunakan kembali ini sama seperti Anda berencana untuk menggunakan kembali layanan komentar.

Jika layanan komentar bertanggung jawab untuk memperbarui komentar pengguna , maka layanan Anda menjadi Pembaruan (Pengguna pengguna, Komentar komentar) dan Anda memiliki fleksibilitas untuk memeriksa aturan bisnis dalam layanan itu sendiri.

Sekarang setelah Anda jelas tentang apa maksud desain Anda, Anda akan memiliki kejelasan tentang bagaimana menerapkan solusi Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.