3

次の問題が発生しました:ユーザーにstaff-statusを付与し、ユーザーの作成を許可し、新しいグループの作成と資格の割り当てを許可しない場合でも、別のユーザーに「admin」-資格を割り当てることができるため、簡単に追加できます自分よりも多くの資格を持っているユーザー!カスタムユーザーモデル/ビューを提供せずにそれを回避する方法を見つけた人はいますか?

ご回答ありがとうございます。

4

1 に答える 1

2

Djangoでは、権限Can add userを持つユーザーにも権限が必要ですCan change userドキュメントの引用:

また、自分のユーザーアカウントでDjango管理サイトを使用してユーザーを作成できるようにする場合は、ユーザーを追加してユーザーを変更する権限(つまり、「ユーザーの追加」と「ユーザーの変更」の権限)を自分に与える必要があります。 )。アカウントにユーザーを追加する権限はあるが変更はできない場合、ユーザーを追加することはできません。なんで?ユーザーを追加する権限がある場合は、スーパーユーザーを作成する権限があり、スーパーユーザーが他のユーザーを変更できるためです。そのため、Djangoでは、わずかなセキュリティ対策として、追加と変更のアクセス許可が必要です。

ModelAdminただし、 (またはそのフォーム)を変更することにより、特定のユーザーが割り当てることができる一連のアクセス許可を制限できる場合があります。を再定義する方法を示す回答は次のとおりUserAdminです。

新しいユーザーは次のことを行う必要があると思います。a)自分よりも多くの権限を持つユーザーを除外する(ユーザーから権限を削除ModelAdminできないようにする)。b)変更ユーザーフォームを変更して、フィールドを設定できず、割り当てることが許可されていない権限がリストから除外されるようにします(または、リスト全体を完全に無効にします-しかし、それが本当に必要なものかどうかはわかりませんよね?作成します。権限をまったく持たないユーザーは、IMOをほとんど使用しません)。superuser

更新:これが私がこれまでに見つけたものです。権限フィルタリングの問題を除いて、上記のすべての目標を満たしている必要があります(質問で尋ねたように動作します-資格のないユーザーによる権限の付与を拒否ます)。ニーズに合わせて変更できます(たとえば、.is_superuserアクセス許可の変更を許可/拒否するロジックに置き換えます)。

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    def queryset(self,request):
        qs = admin.ModelAdmin.queryset(self,request)
        if request.user.is_superuser:
            return qs
        # Only allow viewing/editing users who are not superusers
        return qs.filter(is_superuser=False)
    def get_readonly_fields(self, request, obj=None):
        # Deny editing groups, permissions and the superuser status
        return () if request.user.is_superuser else ('is_superuser', 'groups', 'user_permissions')

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
于 2012-05-28T08:41:23.443 に答える