How do I prevent permission escalation in Django admin when granting “user change” permission?

后端 未结 5 1971
天命终不由人
天命终不由人 2020-12-23 21:49

I have a django site with a large customer base. I would like to give our customer service department the ability to alter normal user accounts, doing things like changing p

5条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-23 22:46

    This approach was put together from several helpful tips on the web. In this case we are modifying UserAdmin so that, for non-superuser staff with user add/change permission, the only permissions and groups they can grant another user are the ones the staff member already has.

    (for Django 1.11)

    from django.contrib.auth.admin import UserAdmin, User
    from django.contrib import admin
    
    class RestrictedUserAdmin(UserAdmin):
        model = User
    
        def formfield_for_dbfield(self, db_field, **kwargs):
            field = super(RestrictedUserAdmin, self).formfield_for_dbfield(db_field, **kwargs)
            user = kwargs['request'].user
            if not user.is_superuser:
                if db_field.name == 'groups':
                    field.queryset = field.queryset.filter(id__in=[i.id for i in user.groups.all()])
                if db_field.name == 'user_permissions':
                    field.queryset = field.queryset.filter(id__in=[i.id for i in user.user_permissions.all()])
                if db_field.name == 'is_superuser':
                    field.widget.attrs['disabled'] = True
            return field
    
    admin.site.unregister(User)
    admin.site.register(User, RestrictedUserAdmin)
    

    This should likewise be done for GroupAdmin if a user is given permission to change groups.

提交回复
热议问题