Обновление разрешений на странице пользователя только при перезапуске сервера с Django-CMS - PullRequest
0 голосов
/ 25 января 2019

По сути, у меня возникла проблема, связанная с тем, что у меня есть страница, использующая инфраструктуру отдыха, которая редактирует права пользователя (я использую пользовательское приложение django по умолчанию), изменяя группы или изменяя другие незначительные сведения, такие как имя и пароль.Тем не менее, когда я редактирую группу пользователей и только когда редактирую их, по какой-то причине права пользователя изменяются только после перезапуска сервера django, позволяя пользователю просматривать страницы django cms, которые он не должен видеть.После перезапуска сервера все разрешения работают нормально.

Я уже пытался принудительно обновить разрешения следующим образом:

for app in settings.INSTALLED_APPS:
    create_permissions(apps.get_app_config(app.split(".")[-1]))

, но это не сработало.

На самом деле я понятия не имею, в чем причина проблемы, настолько, что я не уверен, какой код я мог бы здесь разместить, поэтому сомневаюсь, что выложу сериализатор остальных пользователей:

# -*- coding: utf-8 -*-
from rest_framework import serializers
from django.contrib.auth.models import User


class UserSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        super(UserSerializer, self).__init__(*args, **kwargs)
        self.fields['username'].label = u"Usuário"
        self.fields['password'].label = u"Senha"
        self.fields['first_name'].label = u"Nome Completo"

    group_name = serializers.SerializerMethodField()

    def get_group_name(self, obj):
        return ", ".join(list(obj.groups.values_list('name',flat=True)))

    def create(self, validated_data):
        user = super(UserSerializer, self).create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

    def update(self, instance, validated_data):
        user = super(UserSerializer, self).update(instance, validated_data)
        if "password" in validated_data:
            user.set_password(validated_data['password'])
        user.save()

        return user


    class Meta:
        model = User
        fields = [
            "id",
            "first_name",
            "username",
            "password",
            "group_name",
            "groups",
            "is_active",
        ]

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Итак, проблема заключалась в кешировании меню, и django CMS, похоже, не очень хорошо с кешем. Поэтому я просто отключил весь кеш, который должен был быть отключен в первой строке следующего кода, но на самом деле он только отключил добавление CMS_CACHE_DURATIONS в settings.py:

CMS_PAGE_CACHE = CMS_PLACEHOLDER_CACHE = CMS_PLUGIN_CACHE = False
CMS_CACHE_DURATIONS={
    'menus': 0,
    'content': 0,
    'permissions': 0,
}
0 голосов
/ 25 января 2019

Недостаточно репутации, чтобы просто комментировать, к сожалению. Но кое-что нужно искать. И совет, на чем остановиться.

Правильно ли вы проверяете / обновляете разрешения? Самый простой способ сделать это - просто добавить сообщение в журнал сразу после того, как вы измените разрешение, указав в системе текущие разрешения.

https://docs.djangoproject.com/en/2.1/topics/auth/default/#permission-caching

user.user_permissions.add(permission)

# Checking the cached permission set
user.has_perm('myapp.change_blogpost')  # False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...