По сути, у меня возникла проблема, когда у меня есть страница, использующая платформу отдыха, которая редактирует разрешения пользователя (я использую пользовательское приложение 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",
]
Нет, не использую кеш, если только не используется django cms или rest framework, однако django cms действительно имеет кеш perms, но я отключил его в настройках с помощью CMS_PAGE_CACHE = CMS_PLACEHOLDER_CACHE = CMS_PLUGIN_CACHE = False. Но в документах говорится, что он не записывает указанный кеш если страница требует входа в систему, и они все равно это делают.






Недостаточно репутации, чтобы просто оставить комментарий, к сожалению. Но некоторые вещи, чтобы искать. И посоветуйте, что дополнить.
Вы правильно проверяете/обновляете разрешения? Самый простой способ сделать это — просто добавить сообщение в журнал сразу после того, как вы измените разрешение с тем, что система говорит о текущих разрешениях.
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
Ну, я знаю, что он правильно устанавливает разрешение, потому что я установил его через остальную структуру, а затем он также обновляется в админке. Но проблема в том, что по какой-то причине, когда я редактирую группы, которые есть у пользователя, страницы, которые этому пользователю больше не должны быть разрешены, все еще могут быть доступны ему, но настройки работают после перезапуска сервера. Также. Что обрабатывает, если пользователь может просматривать страницу, это CMS django, поэтому я не знаю, сработает ли проверка perm, я даже не уверен, как бы я сделал это с помощью django cms, и нет документации о том, как сделать это программно .
Итак, проблема заключалась в кешировании меню, а 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,
}
Вы используете какой-то кеш? Если вы перезапустите и разрешения в порядке, ваша функциональность сохранит изменения, как и ожидалось. Проверьте, есть ли у вас кеш или вы каким-то образом полагаетесь на
request.session.