django метод has_perm всегда возвращает false - PullRequest
0 голосов
/ 25 марта 2020

я использую django 1.11,

, если я вызываю request.user.has_perm ("auth.add_user") в оболочке, его возвращаемое значение true. но если я называю это с точки зрения его возврата false,

все отношения разрешений БД в порядке. Я попробовал метод get_object_or_404, чтобы получить пользователя из БД, чтобы избежать кеша. но он не работает

# shell
>>> user = User.objects.get(pk=497)
>>> user.has_perms(["auth.add_user"])
(u'has perm', True)
True

это мой класс разрешений

class DjangoModelPermissionsV2(BasePermission):

    perms_map = {
        'GET': ['%(app_label)s.view_%(model_name)s'],
        'OPTIONS': [],
        'HEAD': [],
        'POST': ['%(app_label)s.add_%(model_name)s'],
        'PUT': ['%(app_label)s.change_%(model_name)s'],
        'PATCH': ['%(app_label)s.change_%(model_name)s'],
        'DELETE': ['%(app_label)s.delete_%(model_name)s'],
    }

    authenticated_users_only = True

    def get_required_permissions(self, method, model_cls):
        kwargs = {
            'app_label': model_cls._meta.app_label,
            'model_name': model_cls._meta.model_name
        }

        return [perm % kwargs for perm in self.perms_map[method]]

    def has_permission(self, request, view):


        if getattr(view, '_ignore_model_permissions', False):
            return True

        if request.user and request.user.is_authenticated() or not self.authenticated_users_only:
            if hasattr(view, 'get_queryset'):
                queryset = view.get_queryset()
            else:
                queryset = getattr(view, 'queryset', None)

        else:
            return request.user and request.user.is_authenticated() or not self.authenticated_users_only

        assert queryset is not None, (
            'Cannot apply DjangoModelPermissions on a view that '
            'does not set `.queryset` or have a `.get_queryset()` method.'
        )

        perms = self.get_required_permissions(request.method, queryset.model)


        return (
            request.user.is_authenticated() and request.user.has_perms(perms)
        )

        # requset.user.has_perms return False

файл настроек

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
#         'rest_framework.permissions.AllowAny',

    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
       'rest_framework.authentication.BasicAuthentication',
       'rest_framework.authentication.SessionAuthentication',
       'oauth2_provider.ext.rest_framework.OAuth2Authentication',
    ],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination' ,
#     'PAGE_SIZE': 100
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.JSONParser',
    ]
}

AUTHENTICATION_BACKENDS = [
    'pgshop.custom_authenticate.CustomAuthenticate',
    'django.contrib.auth.backends.ModelBackend',  
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...