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.
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.
```
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) mehmet=Orang.objek.get(nama_pertama='Mehmet') get_users_with_perms(sekolah, attach_perms=Benar, dengan_superusers=Benar, dengan_group_users=Salah) assign_perm('tambahkan_sekolah', mehmet, sekolah) get_users_with_perms(sekolah, attach_perms=Benar, dengan_superusers=Benar, dengan_group_users=Salah) get_users_with_perms(sekolah, attach_perms=Benar, dengan_superusers=Salah, dengan_group_users=Salah)
{
mehmet.is_superuser
benar
{
{
{
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