如何限制员工用户只能在Django管理页面中查看其信息的访问权限?

米海尔·瓦施(Mihael Waschl)

我创建了一个自定义Django管理页面。我有两种可以访问管理页面的用户(工作人员用户和超级用户)。超级用户可以查看所有用户,并可以更改其设置。他还可以添加或删除用户。员工用户只能看到他们的设置,并且可以更改其中的一些设置。我目前遇到一个问题,员工用户可以看到该Web应用程序的所有用户,并且可以添加或删除他们。我限制工作人员用户查看某些设置,但无法更改。

我不知道如何限制工作人员用户仅查看他们的设置。

这是我的代码:Admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

from .forms import UserAdminChangeForm, UserAdminCreationForm
from .models import UpLoadFile

User = get_user_model()

admin.site.site_header = 'SRC Orkestracija'
admin.site.index_title = 'Administration'
admin.site.register(UpLoadFile)


class UserAdmin(BaseUserAdmin):
    # The forms to add and change user instances
    form = UserAdminChangeForm
    add_form = UserAdminCreationForm

    # The fields to be used in displaying the User model.
    # These override the definitions on the base UserAdmin
    # that reference specific fields on auth.User.
    list_display = ('username', 'superuser', 'active', 'staff')
    list_filter = ('superuser', 'active', 'staff')
    readonly_fields = [
        'last_login'
    ]
    actions = [
        'activate_users',
    ]
    filter_horizontal = ('user_permissions', 'groups')

    fieldsets = (
        (None, {'fields': ('username', 'password', 'config_file')}),
        ('Permissions', {'fields': ('superuser', 'active', 'staff', 'groups', 'user_permissions')}),
        ('Important dates', {'fields': ('last_login',)}),
    )
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
    # overrides get_fieldsets to use this attribute when creating a user.
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2', 'config_file')}
         ),
    )
    search_fields = ('username',)
    ordering = ('username',)

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        is_superuser = request.user.is_superuser
        disabled_fields = set()

        if not is_superuser:
            disabled_fields |= {
                'username',
                'active',
                'superuser',
                'staff',
                'groups',
                'user_permissions'
            }
            if (
                    not is_superuser
                    and obj is not None
                    and obj == request.user
            ):
                disabled_fields |= {
                    'username',
                    'active',
                    'superuser',
                    'staff',
                    'groups',
                    'user_permissions'
                }

            for f in disabled_fields:
                if f in form.base_fields:
                    form.base_fields[f].disabled = True
        return form

    def activate_users(self, request, queryset):
        is_superuser = request.user.is_superuser
        if is_superuser:
            cnt = queryset.filter(active=False).update(active=True)
            self.message_user(request, 'Activated {} users.'.format(cnt))

    activate_users.short_description = 'Activate Users'


admin.site.register(User, UserAdmin)

Models.py:

class UserManager(BaseUserManager):
    def create_user(self, username, config_file, password=None, is_active=True, is_staff=False, is_superuser=False):
        if not username:
            raise ValueError("User must have username!")
        if not password:
            raise ValueError("User must have password!")
        if not config_file:
            raise ValueError("Select config file!")
        user_obj = self.model(
            username=username,
        )
        user_obj.config_file = config_file
        user_obj.staff = is_staff
        user_obj.superuser = is_superuser
        user_obj.active = is_active
        user_obj.set_password(password)
        user_obj.save(using=self._db)
        return user_obj

    def create_staffuser(self, username, config_file, password=None):
        user = self.create_user(
            username=username,
            config_file=config_file,
            password=password,
            is_staff=True
        )
        return user

    def create_superuser(self, username, config_file, password=None):
        user = self.create_user(
            username=username,
            config_file=config_file,
            password=password,
            is_staff=True,
            is_superuser=True
        )
        return user


class CustomUser(AbstractBaseUser, PermissionsMixin):
    class Meta:
        verbose_name = "User"
        verbose_name_plural = "Users"

    OPTIONS = (
        ('1', '1'),
        ('2', '2'),
        ('3', '3'),
        ('4', '4'),
    )
    username = models.CharField(unique=True, max_length=255)
    active = models.BooleanField(default=True,
                                 help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.')
    staff = models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.')
    superuser = models.BooleanField(default=False,
                                    help_text='Designates that this user has all permissions without explicitly assigning them.')
    config_file = models.CharField(choices=OPTIONS, max_length=255)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['config_file']

    object = UserManager()

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_lable):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_superuser(self):
        return self.superuser

    @property
    def is_active(self):
        return self.active


def path(user, filename):
    return os.path.join(str(user))

我将不胜感激任何帮助或说明如何添加此功能。

米奇·洛克伍德

您可以将超级用户设置为仅在admin类中具有添加/删除权限。

class UserAdmin(BaseUserAdmin):
    ...
    def has_add_permission(self, request, obj=None):
        return request.user.is_superuser

    def has_delete_permission(self, request, obj=None):
        return request.user.is_superuser

注意,通过不向管理界面中的任何组或用户授予添加或删除权限,也可以实现上述目的。

以下内容仅允许所有用户为超级用户使用。否则,他们将只能更改自己的用户。

    def has_change_permission(self, request, obj=None):
        return request.user.is_superuser or (obj and obj.id == request.user.id)

并且,如果您希望他们能够看到只有他们可见的用户的用户列表页面,则可以进行修改 get_queryset

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(id=request.user.id)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何防止员工用户在Django中编辑/删除超级用户

来自分类Dev

您如何设置安全性,以便用户只能在Sitecore中查看/编辑其项目?

来自分类Dev

如何确保用户只能在Firebase中查看和访问自己的数据?

来自分类Dev

如何限制用户访问权限以查看/修改其他用户使用 Django 创建的对象

来自分类Dev

如何在Django中限制对管理页面的访问?

来自分类Dev

EDit Django管理表单,因此只有员工用户可以更改用户密码

来自分类Dev

员工用户未经显式分配,无权访问管理网站

来自分类Dev

如何在管理面板中授予特定角色的用户访问特定插件页面的权限?

来自分类Dev

为员工扩展了Django用户模型。如何访问模型管理员的change_form中的employee属性?

来自分类Dev

Django中如何查看登录用户以外的用户信息?

来自分类Dev

如何限制用户只能在vb.net的文本框中输入整数

来自分类Dev

Django REST Framework-如何为非员工用户禁用可浏览的API(is_staff = False)

来自分类Dev

将员工用户限制为用户仪表板

来自分类Dev

如何限制我的管理员使用 php 查看普通用户页面?

来自分类Dev

如何限制用户访问其子域

来自分类Dev

如何限制用户查看他们无权访问的页面?

来自分类Dev

如何创建受保护的页面,以限制对具有正确权限的用户的访问?

来自分类Dev

如何限制用户属性上的页面访问

来自分类Dev

根据Django中的用户权限限制字段

来自分类Dev

根据Django中的用户权限限制字段

来自分类Dev

django - 如何限制未经身份验证的用户可以查看的页面数

来自分类Dev

新硬盘是只读访问权限,只能以root用户访问,如何获得对它的完全访问权限?

来自分类Dev

通过 django 用户权限限制管理菜单项

来自分类Dev

如何从Django模型定义中访问用户信息?

来自分类Dev

如果RBAC权限允许AD组级别的访问,如何限制用户访问Data Lake中的文件夹的权限?

来自分类Dev

如何以下拉方法显示所有员工用户的列表?

来自分类Dev

如何仅使用 React 和 DRF 向员工用户显示内容

来自分类Dev

Cloud Firestore规则-如何通过访问商店中的不同集合来查看用户权限?

来自分类Dev

如何使每个用户根据其在JAAS中的权限/角色访问特定位置的资源?

Related 相关文章

  1. 1

    如何防止员工用户在Django中编辑/删除超级用户

  2. 2

    您如何设置安全性,以便用户只能在Sitecore中查看/编辑其项目?

  3. 3

    如何确保用户只能在Firebase中查看和访问自己的数据?

  4. 4

    如何限制用户访问权限以查看/修改其他用户使用 Django 创建的对象

  5. 5

    如何在Django中限制对管理页面的访问?

  6. 6

    EDit Django管理表单,因此只有员工用户可以更改用户密码

  7. 7

    员工用户未经显式分配,无权访问管理网站

  8. 8

    如何在管理面板中授予特定角色的用户访问特定插件页面的权限?

  9. 9

    为员工扩展了Django用户模型。如何访问模型管理员的change_form中的employee属性?

  10. 10

    Django中如何查看登录用户以外的用户信息?

  11. 11

    如何限制用户只能在vb.net的文本框中输入整数

  12. 12

    Django REST Framework-如何为非员工用户禁用可浏览的API(is_staff = False)

  13. 13

    将员工用户限制为用户仪表板

  14. 14

    如何限制我的管理员使用 php 查看普通用户页面?

  15. 15

    如何限制用户访问其子域

  16. 16

    如何限制用户查看他们无权访问的页面?

  17. 17

    如何创建受保护的页面,以限制对具有正确权限的用户的访问?

  18. 18

    如何限制用户属性上的页面访问

  19. 19

    根据Django中的用户权限限制字段

  20. 20

    根据Django中的用户权限限制字段

  21. 21

    django - 如何限制未经身份验证的用户可以查看的页面数

  22. 22

    新硬盘是只读访问权限,只能以root用户访问,如何获得对它的完全访问权限?

  23. 23

    通过 django 用户权限限制管理菜单项

  24. 24

    如何从Django模型定义中访问用户信息?

  25. 25

    如果RBAC权限允许AD组级别的访问,如何限制用户访问Data Lake中的文件夹的权限?

  26. 26

    如何以下拉方法显示所有员工用户的列表?

  27. 27

    如何仅使用 React 和 DRF 向员工用户显示内容

  28. 28

    Cloud Firestore规则-如何通过访问商店中的不同集合来查看用户权限?

  29. 29

    如何使每个用户根据其在JAAS中的权限/角色访问特定位置的资源?

热门标签

归档