用户页面权限仅在服务器使用 Django-CMS 重新启动时更新

User page permissions updating only when server restarts with Django-CMS

基本上,我遇到一个问题,我有一个使用 rest 框架的页面,该页面通过更改组或更改名称和密码等其他次要信息来编辑用户(我使用的是默认的 django 用户应用程序)权限。但是,当我编辑一组用户时,并且仅当我编辑它们时,出于某种原因,用户权限仅在我重新启动 django 服务器时才会更改,从而允许用户查看他不应该看到的 django cms 页面。服务器重新启动后,所有权限都可以正常工作。

我已经尝试过像这样强制刷新权限:

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

但是没用。

我实际上不知道问题的原因是什么,以至于我不确定我可以在这里放什么代码,所以有疑问我会 post 其余用户序列化程序:

# -*- 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",
        ]

不幸的是,信誉不足,无法发表评论。但有些东西要寻找。以及关于扩展内容的建议。

您 checking/refreshing 权限是否正确?最简单的方法是在您根据系统所说的当前权限进行权限更改后立即添加一条日志消息。

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

所以,问题出在菜单缓存上,django CMS 似乎不太适合缓存。所以我简单地禁用了所有缓存,应该使用以下代码的第一行禁用它,但它实际上只是禁用了在 settings.py:

中添加 CMS_CACHE_DURATIONS
CMS_PAGE_CACHE = CMS_PLACEHOLDER_CACHE = CMS_PLUGIN_CACHE = False
CMS_CACHE_DURATIONS={
    'menus': 0,
    'content': 0,
    'permissions': 0,
}