【问题标题】:User page permissions updating only when server restarts with Django-CMS仅在使用 Django-CMS 重新启动服务器时更新用户页面权限
【发布时间】:2019-06-18 16:54:21
【问题描述】:

基本上,我有一个问题,我有一个使用 rest 框架的页面,它通过更改组或更改名称和密码等其他次要信息来编辑用户(我正在使用默认的 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",
        ]

【问题讨论】:

  • 你在使用某种缓存吗?如果您重新启动并且权限正常,则您的功能正在按预期保存更改。检查您是否有一些缓存,或者您是否依赖于request.session
  • 不,不使用缓存,除非使用 django cms 或 rest 框架,但是,django cms 确实有一个 perms 缓存,但是,我在设置中禁用了它 CMS_PAGE_CACHE = CMS_PLACEHOLDER_CACHE = CMS_PLUGIN_CACHE = False 但它说如果页面需要登录,它不记录缓存的文档,无论如何他们都会这样做。

标签: python django permissions django-rest-framework django-cms


【解决方案1】:

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

您是否正确检查/刷新权限?最简单的方法是在您使用系统所说的当前权限进行权限更改后立即添加一条日志消息。

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,所以我不知道检查 perm 是否有效,我什至不确定如何使用 django cms 来执行此操作,并且没有关于如何以编程方式执行此操作的文档.
【解决方案2】:

所以,问题出在菜单缓存上,而 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,
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 2021-12-02
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多