web-dev-qa-db-fra.com

Django is_staff permission decorator

J'essaie de limiter l'accès aux pages en utilisant 2 niveaux d'utilisateurs. Superutilisateur et administrateur. Le super utilisateur est un utilisateur régulier Django avec "is_superuser" affecté. L'utilisateur administrateur est également un utilisateur régulier avec uniquement l'autorisation "is_staff" attribué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') renvoie false pour les utilisateurs anonymes. (correct)
@permission_required('is_superuser') renvoie uniquement vrai pour les superutilisateurs (correct)
@permission_required('is_staff') renvoie FAUX pour les utilisateurs avec le perm 'is_staff' assigné. (faux).

Des pensées?

51
Dim

is_staff n'est pas une autorisation 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
104
arie

Pour les vues basées sur les classes, le serPassesTestMixin est pratique, par ex.

class ImportFilePostView(LoginRequiredMixin, UserPassesTestMixin):
  def test_func(self):
    return self.request.user.is_staff
  ...
7
shadi

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

from Django.contrib.auth.decorators import permission_required

url(r'^your-url$', permission_required('is_staff')(YourView.as_view()), name='my-view'),
7
Nikolay Georgiev