Pertanyaan Bagaimana cara menggunakan grup dan izin Django?


Saya memahami hal-hal dasar pengguna. Saya tahu otentikasi, masuk, membuat akun, dll. Tapi sekarang saya ingin bekerja pada grup dan izin.

Di mana dokumentasi untuk grup / izin django? Bukan ini: http://docs.djangoproject.com/en/dev/topics/auth/


75
2018-01-24 04:36


asal


Jawaban:


Saya kira pertanyaan pertama yang perlu Anda tanyakan adalah izin apa yang Anda butuhkan dan seperti apa. Dengan cara apa, maksud saya apakah Anda ingin Model- atau Object-level. Untuk memperjelas perbedaannya mengatakan Anda memiliki model Mobil. Jika Anda ingin memberikan izin pada semua mobil, maka Model-level sesuai, tetapi jika Anda ingin memberikan izin pada basis per mobil yang Anda inginkan Object-level. Anda mungkin membutuhkan keduanya, dan ini bukan masalah seperti yang akan kita lihat.

Untuk izin Model, Django menangani ini untuk Anda ... kebanyakan. Untuk setiap model Django akan membuat izin dalam bentuk 'appname.permissionname_modelname'. Jika Anda memiliki aplikasi yang disebut 'driver' dengan model Mobil maka satu izin akan menjadi 'drivers.delete_car'. Izin yang dibuat Django secara otomatis akan dibuat, diubah, dan dihapus. Untuk beberapa alasan aneh mereka memutuskan untuk tidak memasukkan izin baca dari CRUD, Anda harus melakukan ini sendiri. Perhatikan bahwa Django memutuskan untuk mengubah 'pembaruan' CRUD menjadi 'perubahan' karena alasan tertentu. Untuk menambahkan lebih banyak izin ke model, ucapkan izin baca, Anda menggunakan kelas Meta:

class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

Perhatikan bahwa izin adalah sekumpulan tupel, di mana item tuple adalah izin seperti yang dijelaskan di atas dan deskripsi dari izin itu. Anda tidak harus mengikuti konvensi permname_modelname tetapi saya biasanya mematuhinya.

Akhirnya, untuk memeriksa perizinan, Anda dapat menggunakan has_perm:

obj.has_perm( 'drivers.read_car' )

Di mana obj adalah contoh Pengguna atau Grup. Saya pikir lebih mudah untuk menulis fungsi untuk ini:

def has_model_permissions( entity, model, perms, app ):
    for p in perms:
        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
            return False
    return True

Di mana entitas adalah objek untuk memeriksa perizinan pada (Grup atau Pengguna), model adalah contoh dari model, perms adalah daftar izin sebagai string untuk memeriksa (misalnya ['baca', 'ubah']), dan aplikasi adalah nama aplikasi sebagai string. Untuk melakukan pemeriksaan yang sama dengan has_perm di atas Anda akan memanggil sesuatu seperti ini:

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

Jika Anda perlu menggunakan objek atau baris perizinan (mereka berarti hal yang sama), maka Django tidak dapat benar-benar membantu Anda dengan sendirinya. Yang menyenangkan adalah Anda dapat menggunakan kedua model dan izin objek secara berdampingan. Jika Anda ingin izin objek Anda harus baik tulis sendiri (jika menggunakan 1.2+) atau cari proyek yang ditulis orang lain, yang saya suka adalah django-objectpermissions dari washingtontimes.


110
2018-01-24 17:19