Django est décorateur de permission du personnel

j'essaie de limiter l'accès aux pages en utilisant 2 niveaux utilisateurs. Superutilisateur et administrateur. Super user est un utilisateur régulier de Django avec' is_superuser ' assigné. Admin user est aussi un utilisateur régulier avec seulement la permission 'is_staff' assignée.

le problème est que lorsque j'utilise ce décorateur pour un utilisateur administrateur, il ne passe pas le test:

@permission_required('is_staff')
def my_view(....)

@permission_required('is_staff') retourne false pour les utilisateurs anonymes. (correct)

@permission_required('is_superuser') renvoie seulement true pour superusers (correct)

@permission_required('is_staff') retourne FALSE pour les utilisateurs avec la perm' is_staff ' assignée. (mauvais.)

une idée?

44
demandé sur phineas 2011-04-29 18:10:38

3 réponses

is_staff n'est pas une permission donc au lieu de permission_required vous pouvez utiliser:

@user_passes_test(lambda u: u.is_staff)

ou

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
95
répondu arie 2012-09-05 15:24:19

pour les vues basées sur des classes, vous pouvez ajouter permission_required('is_staff') au urls.py :

from django.contrib.auth.decorators import permission_required

url(r'^your-url$', permission_required('is_staff')(YourView.as_view()), name='my-view'),
8
répondu Nikolay Georgiev 2014-06-24 11:02:26

pour les vues par classe, le Userpassestmixin est pratique, p.ex.

class ImportFilePostView(LoginRequiredMixin, UserPassesTestMixin):
  def test_func(self):
    return self.request.user.is_staff
  ...
1
répondu shadi 2018-04-18 13:44:50