Django-guardian: Izin global vs izin objek

Dibuat pada 22 Des 2015  ·  16Komentar  ·  Sumber: django-guardian/django-guardian

Tampaknya ada sejumlah bug karena beberapa rutinitas menggunakan izin global, dan yang lainnya hanya menggunakan izin objek. Akan menutup bug terkait dan merujuknya di sini.

API change Enhancement

Semua 16 komentar

Ya untuk ini!

permission_required_or_403 memiliki parameter accept_global_perms, tetapi tidak ada cara untuk melakukan hal yang sama dengan get_obj_perms

Saya mengusulkan tag get_obj_perms_with_global yang menyertakan izin global.

Saya tidak tahu apakah Anda sudah memulai jalan ini, tetapi saya akan mulai mengerjakan tambalan untuk melakukannya; jika Anda sudah memulai, jangan ragu untuk menghentikan saya :)

PS Saya pikir ada argumen yang harus dibuat bahwa perilaku default harus menyertakan izin global, menurut saya ketika Anda bertanya "dapatkah pengguna X melakukan Y ke objek Z" yang menyiratkan memeriksa semua pengguna/objek, grup/objek , izin pengguna/global, grup/global. Tapi itu mungkin hanya karena cara saya menggunakannya.

Setelah mengatakan semua itu, cukup mudah untuk memeriksa izin global secara terpisah...Hrmmm.

Pestik: ada cukup banyak masalah pada wali sebagai bukti betapa membingungkannya hal ini. Kami mendapatkan sedikit setiap enam bulan ... jika request.user.has_access('foo', obj) harus benar jika mereka memiliki izin global tetapi tidak izin tingkat objek. Menulis cek dua kali itu menjijikkan.

Apa yang perlu terjadi untuk mengubah ini?

Saya pikir seseorang perlu menulis permintaan tarik ... Idealnya sedemikian rupa sehingga tidak merusak kode yang ada (jika ini waras dan layak atau tidak saya tidak tahu).

Masalah lama, tetapi saya belum melihat permintaan tarik. Ada berita tentang ini? Saya mengalami perilaku yang sama, yang menurut saya tidak dapat diprediksi. Terima kasih banyak!

Saya menambahkan beberapa komentar ke #49 karena itu memiliki lebih banyak wawasan tentang masalah apakah dan bagaimana cara mundur ke global ketika tingkat objek gagal. Saya tidak yakin apakah masalah tertutup menimbulkan pemberitahuan, jadi saya menambahkan ini di sini.

Bergantung pada keputusan desain yang dibuat, saya memiliki niat untuk mengerjakan beberapa masalah ini.

Saya akan dengan senang hati membantu masalah ini.

327 tampaknya tetap bagi saya.

```
brandon=Person.objects.get(first_name='BRANDON')
brandon.is_superuser
Palsu

sekolah=Sekolah.objek.get(pk=1)

get_users_with_perms(sekolah, attach_perms=Benar, dengan_superusers=Salah, dengan_group_users=Salah)
{}

assign_perm('tambahkan_sekolah', brandon, sekolah)

get_users_with_perms(sekolah, attach_perms=Benar, dengan_superusers=Salah, dengan_group_users=Salah)
{: ['tambahkan_sekolah']}

mehmet=Orang.objek.get(nama_pertama='Mehmet')
mehmet.is_superuser
benar

get_users_with_perms(sekolah, attach_perms=Benar, dengan_superusers=Benar, dengan_group_users=Salah)
{: [],: ['tambahkan_sekolah', 'ubah_sekolah', 'hapus_sekolah']}

assign_perm('tambahkan_sekolah', mehmet, sekolah)

get_users_with_perms(sekolah, attach_perms=Benar, dengan_superusers=Benar, dengan_group_users=Salah)
{: [],: ['tambahkan_sekolah', 'ubah_sekolah', 'hapus_sekolah']}

get_users_with_perms(sekolah, attach_perms=Benar, dengan_superusers=Salah, dengan_group_users=Salah)
{: ['tambahkan_sekolah'],: ['tambahkan_sekolah']}

Pada #155:

Penambahan dua baris berikut diminta ke get_obj_perms_field_choices (self) :

        if self.exclude_default:
            choices = list(set(choices).intersection(self.obj._meta.permissions))

untuk mengecualikan izin default Model. Pertama, saya tidak jelas tentang bagaimana intersection akan melakukan itu. Kedua, itu sepertinya tidak terkait dengan izin objek vs model. Harap perbaiki saya jika saya kehilangan sesuatu.

Tapi, saat melihat ke dalamnya, saya perhatikan perlu ada pemisahan izin objek vs model di:

    def save_obj_perms(self):
        """
        Saves selected object permissions by creating new ones and removing
        those which were not selected but already exists.

        Should be called *after* form is validated.
        """
        perms = self.cleaned_data[self.get_obj_perms_field_name()]
        model_perms = [c[0] for c in self.get_obj_perms_field_choices()]

        to_remove = set(model_perms) - set(perms)
        for perm in to_remove:
            remove_perm(perm, self.user, self.obj)

        for perm in perms:
            assign_perm(perm, self.user, self.obj)

Sepertinya, itu menyimpan di tingkat objek izin apa pun yang hilang, sementara menurut saya, izin apa pun yang tersedia di tingkat model harus dilewati, atau opsi untuk itu disediakan.

Saya pikir pengaturan global seperti GUARDIAN_FALLBACK_TO_MODEL=False dan argumen untuk metode yang berlaku seperti fallback_to_model=False diperlukan untuk menggambarkan izin objek dan izin model dengan benar. Nilai default False memastikan kompatibilitas mundur. Jika salah satu dari global atau pengaturan argumen adalah True, fallback harus dilakukan.

+1 untuk GUARDIAN_FALLBACK_TO_MODEL.

Per diskusi di # 49 saya pikir pengaturan itu mungkin juga berfungsi dengan baik untuk mengontrol apakah ObjectPermissionBackend eksplisit atau tidak.

Saya membuat permintaan tarik (#546). Ini memungkinkan fungsi pemeriksa dalam opsi core.py untuk mundur ke (atau menyertakan) izin tingkat model. Modul lain juga perlu ditinjau. Saya berencana untuk meninjaunya saat saya menggunakannya. Jika ada yang ingin terjun, dipersilakan.

Sepertinya #327 sudah tidak ada lagi. #332 diperbaiki oleh permintaan tarik di atas jika diterima. Hanya ada satu masalah sampingan terkait dengan #155 (disebutkan di atas) yang tersisa. Jika itu juga diurus (atau dipindahkan ke masalah terpisah), saya pikir masalah ini bisa ditutup.

Izin global masih tidak dihormati untuk izin tingkat objek jika disetel, apakah saya salah di sini?

u = User.objects.get(id=1)
c = Client.objects.get(id=1)
assign_perm('core.change_client', u)
u = User.objects.get(id=1)  # reloading user for perm refresh
u.has_perm('core.change_client')  # True
u.has_perm('core.change_client', c)  # False
u.has_perm('change_client', c)  # False
get_perms(u, c)  # []

Dan apa yang dilakukan pengaturan GUARDIAN_GLOBAL_PERMISSIONS_CARRY_OVER atau FALLBACK_TO_MODEL ? Keduanya tampaknya tidak didokumentasikan.

Tidakkah cukup untuk menambahkan ini ke core.py ?

get_user_perms:126 yang tampaknya menjadi pusat dari semua pemeriksaan izin pengguna; atau dapat dipicu menggunakan flag boolean

def get_user_perms(self, obj):
    # ....
    user_global_perms = Permission.objects.filter(content_type=ctype)\
                                        .filter(user=self.user)\
                                        .values_list('codename', flat=True)
    user_object_perms = user_perms_qs.values_list("codename", flat=True)
    user_perms = list(chain(user_global_perms, user_object_perms))
    return user_perms
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ad-m picture ad-m  ·  13Komentar

David-OConnor picture David-OConnor  ·  6Komentar

g-as picture g-as  ·  10Komentar

xuhcc picture xuhcc  ·  10Komentar

Allan-Nava picture Allan-Nava  ·  4Komentar