Django-guardian: 特定のグループのみのメンバーの追加/削除

作成日 2017年11月20日  ·  35コメント  ·  ソース: django-guardian/django-guardian

こんにちは。特定のグループのユーザーが、所属するグループに対してのみ追加、削除、または削除できるようにする権限が必要です。

全てのコメント35件

問題ありません。そのような権限を作成し、django-guardianサポートを使用して手動でアクセス制御を実装する必要があります。

のようなアクセス制御?

この機能を実装するにはどうすればよいですか?

Django-guardianは、あらゆるオブジェクトのアクセス制御ライブラリです。 このようなオブジェクトはグループの場合もあります。 サンプルプロジェクトのアクセス制御を参照してください。 https://github.com/django-guardian/django-guardian/blob/devel/example_project/articles/views.py#L35を参照して

完全!

これは私のスニペットコードです:

def create_user_profile(sender, instance, created, **kwargs):
    print("create_user_profile")
    try:
        print("created: "+ str(created))
        if created:
            Profile.objects.create(user=instance)
            print("Member.objects.get_or_create(django_user=instance)")
            #Create a user into groups_manager_member
            member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
            print("member instance created")
            print(member)
            print("Group.objects.create(name=ID_GROUP+instance.username)")

            #Create a group into groups_manager_group
            group = Group.objects.create(name=ID_GROUP+instance.username)
            print("group instance created")
            print(group)
            #Add member into the group correct
            group.add_member(member=member)
            print("member added into the group correct")

    except Exception as e:
        print("Exception: "+str(e))
        pass


def save_user_profile(sender, instance, **kwargs):
    print("save_user_profile")
    try:
        instance.profile.save()

    except Exception as e:
        print("Exception: "+str(e))
        pass

post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User)

グループのすべてのユーザーを追加/削除する権限が必要です。

どこに問題があるのか​​わかりません。 次のようなものが必要です。

class ProtectedGroupUpdateView(PermissionRequiredMixin, GroupUpdateView):
    permission_required = ['change_group', ]
    ...

作成時にグループに権限を割り当てます。

「メンバーを追加できます」という権限を追加しようとしましたが、スタッフではなく、すべてのグループで可能です。

どういう意味かわかりません。 django-guardian特権は、常にユーザーまたはユーザーのグループに付与されます。 役割や特別な条件に基づいて特権を付与することはできません。 「X」グループを管理する権限をスタッフに付与する場合は、「スタッフ」グループを作成し、それにスタッフを追加し、「X」グループを追加して、「スタッフ」グループに「X」を管理する権限を付与します。グループ。

グループに所属するユーザーが必要です
「X」はグループ「X」に対してのみ追加または削除できますが、残念ながら現在はそうではありません。「ユーザーを追加できます」という権限があれば、見習いではなくすべてのグループに対してそれを行うことができます。

私の悪い英語でごめんなさい

残念ながら、私はあなたの期待を理解することができません。 サンプルプロジェクトを注意深く調べ

"X" can add or remove only for group "X"意味:

  1. グループXを作成し、
  2. グループXのメンバーを追加する
  3. グループXを管理する権限をグループXに割り当てます。

実際には、グループ「x」に属するユーザーが、自分のグループから他のユーザーのみを追加または削除できることを確認する必要があります。

@ Allan-Nava、django-guardian権限は、常にユーザーまたはユーザーのグループに付与されます。 役割や特別な条件に基づいて特権を付与することはできません。 ユーザーにグループの管理を許可する場合は、そのグループをオブジェクトとして管理する権限をグループに付与します。

「X」グループを管理するための「X」グループ権限を割り当てて確認する方法を理解していますか?

それはnetflixのようである必要があります(ただし、すべてのメンバーがログインする可能性があります):すべてのユーザーは、好みに応じてユーザーを追加または削除できる個人グループを持っている必要があります。 問題は、この権限を付与するとユーザーを追加することです。これは、そのグループに属するユーザーではなく、他のすべてのグループに影響します。

問題は、この権限を付与するとユーザーを追加することです。これは、そのグループに属するユーザーではなく、他のすべてのグループに影響します。

それは間違いなく真実ではありません。 この文はDjangoコアに当てはまります。 グループXの管理グループXに付与された正しいDjango-guardian権限を使用している場合、グループXにのみ適用されます。サンプルプロジェクトの場合と同様に、特定の記事を管理する権利を付与しても、他の記事を編集できるわけではありません。そのユーザーによって。

すべてのユーザーが他のユーザーをメンバーシップグループに追加できる単一のアクセス許可を作成したいと思います。 メンバーシップグループ「X」を使用して新しいユーザーを作成するたびに、「Xにグループを追加できます」という新しいアクセス許可を作成する必要があります。そのアクセス許可には、オブジェクトとしてグループ「X」が必要です。

このような:

def create_user_profile(sender, instance, created, **kwargs):
    print("create_user_profile")
    try:
        print("created: "+ str(created))
        if created:
            Profile.objects.create(user=instance)
            print("Member.objects.get_or_create(django_user=instance)")
            #Create a user into groups_manager_member
            member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
            print("member instance created")
            print(member)
            print("Group.objects.create(name=ID_GROUP+instance.username)")

            #Create a group into groups_manager_group
            group = Group.objects.create(name=ID_GROUP+instance.username)
            print("group instance created")
            print(group)
            #Add member into the group correct
            group.add_member(member=member)
            print("member added into the group correct")
            UserObjectPermission.objects.assign_perm('can_add_member_for_xgroup', member, obj=group)

    except Exception as e:
        print("Exception: "+str(e))
        pass


def save_user_profile(sender, instance, **kwargs):
    print("save_user_profile")
    try:
        instance.profile.save()

    except Exception as e:
        print("Exception: "+str(e))
        pass

post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User)



異常とは、千の許可の作成です。 assign_perm('manage_group',group,group)またはassign_perm('manage_group',user,group)で十分です。 残りは、ユーザーが特定のグループを管理する権限を持っているかどうかを検証することです。

完璧ですが、テンプル騎士団のビューでどのように確認できますか?

{{perms.groups_manager.canaddmemberx2}}

@ Allan-Navaも、サンプルプロジェクト、特にテンプレートRTFDを注意深く調べます。

@ ad-mわかりました、ありがとう、私のスニペットコード:

from guardian.shortcuts import assign_perm

def create_user_profile(sender, instance, created, **kwargs):
    print("create_user_profile")
    try:
        print("created: "+ str(created))
        if created:
            Profile.objects.create(user=instance)
            print("Member.objects.get_or_create(django_user=instance)")
            #Create a user into groups_manager_member
            member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
            print("member instance created")
            print(member)
            print("Group.objects.create(name=ID_GROUP+instance.username)")

            #Create a group into groups_manager_group
            group = Group.objects.create(name=ID_GROUP+instance.username)
            print("group instance created")
            print(group)
            #Add member into the group correct
            group.add_member(member=member)
            print("member added into the group correct")
            #UserObjectPermission.objects.assign_perm('can_add_member_for_xgroup', member, obj=group)
            assign_perm('groups_manager.can_add_member_custom', member, group)

    except Exception as e:
        print("Exception: "+str(e))
        pass


def save_user_profile(sender, instance, **kwargs):
    print("save_user_profile")
    try:
        instance.profile.save()

    except Exception as e:
        print("Exception: "+str(e))
        pass

post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User)

@ ad-mこのコードを試しましたが、例外が発生しました。

#Add member into the group correct
            group.add_member(member=member)
            print("member added into the group correct")

            #Assign permission for the groups
            assign_perm('groups_manager.can_add_member_custom', member, group)
            print("assign_perm('groups_manager.can_add_member_custom', member, group)")

screen shot 2017-11-21 at 10 14 30

@ Allan-Nava、エラーメッセージではっきりしないことは何ですか?

@ ad-m
私はこのバグを手に入れました:

def create_user_profile(sender, instance, created, **kwargs):
    print("create_user_profile")
    try:
        print("created: "+ str(created))
        if created:
            Profile.objects.create(user=instance)
            print("Member.objects.get_or_create(django_user=instance)")
            #Create a user into groups_manager_member
            member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
            print("member instance created")
            print(member)
            print("Group.objects.create(name=ID_GROUP+instance.username)")

            #Create a group into groups_manager_group
            group = Group.objects.create(name=ID_GROUP+instance.username)
            print("group instance created")
            print(group)
            #Add member into the group correct
            group.add_member(member=member)
            print("member added into the group correct")

            #Assign permission for the groups
            assign_perm('groups_manager.can_add_member_custom', instance, group)
            print("assign_perm('groups_manager.can_add_member_custom', instance, group)")

    except Exception as e:
        print("Exception: "+str(e))
        pass

screen shot 2017-11-21 at 12 53 38

@ Allan-Nava、エラーメッセージではっきりしないことは何ですか?

@ ad-mどこに問題があるのか​​わかりません

@ Allan-Nava、この種の許可はありません。 ドキュメントを読んで、どのような権限が存在するかを確認してください

読みましたが、新しいユーザーを作成するときに、N個のグループ/ユーザーに対してN個の権限を作成する必要がありますか?

content_type = ContentType.objects.get_for_model(Group)
permission = Permission.objects.create(
    codename='can_add_member_custom',
    name='Can Add Member Custom',
    content_type=content_type,
)

前に言ったよう

異常とは、千の許可の作成です。

アクションタイプごとに1つの権限。

前に言ったように:
異常とは、千の許可の作成です。
アクションタイプごとに1つの権限。

わかりましたが、一般的な許可を作成するにはどうすればよいですか?

Djangoのコアドキュメントが言ったように。 上にリンクされています。

はい、Django GroupsManagerを使用しています。

これは私のモデルグループです:

class Group(GroupMixin):

    group_type = models.ForeignKey(GroupType, null=True, blank=True, on_delete=models.SET_NULL,
                                   related_name='%(app_label)s_%(class)s_set')
    group_entities = models.ManyToManyField(GroupEntity, blank=True,
                                            related_name='%(app_label)s_%(class)s_set')

    django_group = models.ForeignKey(DjangoGroup, null=True, blank=True, on_delete=models.SET_NULL)
    group_members = models.ManyToManyField(Member, through='GroupMember',
                                           related_name='%(app_label)s_%(class)s_set')

    # this is just required for easy explanation
    class Meta(GroupMixin.Meta):
        abstract = False
        permissions = (
            ('can_add_member_custom', 'Can Add Member Custom'),
        )

そしてこれは私のモデルのプロフィールです:

from __future__ import unicode_literals

import hashlib
import os.path
import urllib

from django.conf import settings
from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.utils.encoding import python_2_unicode_compatible

from bootcamp.activities.models import Notification
#Custom class - ParentsProfile
from bootcamp.parents.models import ParentsProfile
#Custom class - MemberMixin TO CREATE INTO groups_manager_member
from bootcamp.groups_manager.models import MemberMixin, Member, Group
#Import django guardian assign_perm
from guardian.shortcuts import assign_perm
#import UserObjectPermission
from guardian.models import UserObjectPermission

import datetime

ID_GROUP = "Group_"

'''
User Model - Authentication
'''
<strong i="12">@python_2_unicode_compatible</strong>
class Profile(models.Model):
    user = models.OneToOneField(User)
    location = models.CharField(max_length=50, null=True, blank=True)
    url = models.CharField(max_length=50, null=True, blank=True)
    job_title = models.CharField(max_length=50, null=True, blank=True)

    #I need to delete the parents application

    #Other tascout attributes
    birthdate = models.DateField(default=datetime.date.today)
    address = models.CharField(max_length=255, null=True, blank=True)
    main_role = models.CharField(max_length=255, null=True, blank=True)
    other_roles = models.CharField(max_length=255, null=True, blank=True)
    mobile = models.CharField(max_length=255, null=True, blank=True)
    background_photo = models.CharField(max_length=255, null=True, blank=True)
    profile_photo = models.CharField(max_length=255, null=True, blank=True)
    biography = models.TextField(null=True, blank=True)
    idols = models.TextField(null=True, blank=True)
    weight = models.IntegerField(default=0)
    height = models.IntegerField(default=0)
    favorite_team = models.CharField(max_length=255, null=True, blank=True)
    level = models.IntegerField(default=0)
    sex = models.CharField(max_length=1, default="M")
    nationality = models.CharField(max_length=255, null=True, blank=True)
    city = models.CharField(max_length=255, null=True, blank=True)
    postal_code = models.CharField(max_length=255, null=True, blank=True)
    province = models.CharField(max_length=255, null=True, blank=True)
    number = models.CharField(max_length=255, null=True, blank=True)
    latitude = models.DecimalField( null=True, blank=True, max_digits=9, decimal_places=6)
    longitude = models.DecimalField( null=True, blank=True, max_digits=9, decimal_places=6)

    class Meta:
        db_table = 'auth_profile'

    def __str__(self):
        return self.user.username

    def get_url(self):
        url = self.url
        if "http://" not in self.url and "https://" not in self.url and len(self.url) > 0:  # noqa: E501
            url = "http://" + str(self.url)

        return url

    def get_picture(self):
        no_picture = settings.MEDIA_URL +'/profile_pictures/user.png'
        try:
            filename = settings.MEDIA_ROOT + '/profile_pictures/' +\
                self.user.username + '.jpg'
            picture_url = settings.MEDIA_URL + 'profile_pictures/' +\
                self.user.username + '.jpg'
            if os.path.isfile(filename):  # pragma: no cover
                return picture_url
            else:  # pragma: no cover
                gravatar_url = 'http://www.gravatar.com/avatar/{0}?{1}'.format(
                    hashlib.md5(self.user.email.lower()).hexdigest(),
                    urllib.urlencode({'d': no_picture, 's': '256'})
                    )
                return gravatar_url

        except Exception:
            return no_picture

    #Retrieve users' cover
    def get_cover(self):
        no_cover = settings.MEDIA_ROOT +'profile_covers/cover.jpg'
        try:
            filename = settings.MEDIA_ROOT + '/profile_covers/' +\
                self.user.username + '.jpg'
            cover_url = settings.MEDIA_URL + 'profile_covers/' +\
                self.user.username + '.jpg'
            if os.path.isfile(filename) and os.path.exists(filename):  # pragma: no cover
                if cover_url != None:
                    return cover_url
                else:
                    return no_cover
            else:
                no_cover
        except Exception:
            return no_cover

    def get_screen_name(self):
        try:
            if self.user.get_full_name():
                return self.user.get_full_name()
            else:
                return self.user.username
        except:
            return self.user.username

    def notify_liked(self, feed):
        if self.user != feed.user:
            Notification(notification_type=Notification.LIKED,
                         from_user=self.user, to_user=feed.user,
                         feed=feed).save()

    def unotify_liked(self, feed):
        if self.user != feed.user:
            Notification.objects.filter(notification_type=Notification.LIKED,
                                        from_user=self.user, to_user=feed.user,
                                        feed=feed).delete()

    def notify_commented(self, feed):
        if self.user != feed.user:
            Notification(notification_type=Notification.COMMENTED,
                         from_user=self.user, to_user=feed.user,
                         feed=feed).save()

    def notify_also_commented(self, feed):
        comments = feed.get_comments()
        users = []
        for comment in comments:
            if comment.user != self.user and comment.user != feed.user:
                users.append(comment.user.pk)

        users = list(set(users))
        for user in users:
            Notification(notification_type=Notification.ALSO_COMMENTED,
                         from_user=self.user,
                         to_user=User(id=user), feed=feed).save()

    def notify_favorited(self, question):
        if self.user != question.user:
            Notification(notification_type=Notification.FAVORITED,
                         from_user=self.user, to_user=question.user,
                         question=question).save()

    def unotify_favorited(self, question):
        if self.user != question.user:
            Notification.objects.filter(
                notification_type=Notification.FAVORITED,
                from_user=self.user,
                to_user=question.user,
                question=question).delete()

    def notify_answered(self, question):
        if self.user != question.user:
            Notification(notification_type=Notification.ANSWERED,
                         from_user=self.user,
                         to_user=question.user,
                         question=question).save()

    def notify_accepted(self, answer):
        if self.user != answer.user:
            Notification(notification_type=Notification.ACCEPTED_ANSWER,
                         from_user=self.user,
                         to_user=answer.user,
                         answer=answer).save()

    def unotify_accepted(self, answer):
        if self.user != answer.user:
            Notification.objects.filter(
                notification_type=Notification.ACCEPTED_ANSWER,
                from_user=self.user,
                to_user=answer.user,
                answer=answer).delete()

def create_user_profile(sender, instance, created, **kwargs):
    print("create_user_profile")
    try:
        print("created: "+ str(created))
        if created:
            Profile.objects.create(user=instance)
            print("Member.objects.get_or_create(django_user=instance)")
            #Create a user into groups_manager_member
            member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
            print("member instance created")
            print(member)
            print("Group.objects.create(name=ID_GROUP+instance.username)")

            #Create a group into groups_manager_group
            group = Group.objects.create(name=ID_GROUP+instance.username)
            print("group instance created")
            print(group)
            #Add member into the group correct
            group.add_member(member=member)
            print("member added into the group correct")

            #Assign permission for the groups
            assign_perm('can_add_member_custom', instance, group)
            #print("assign_perm('can_add_member_custom', instance, group)")

    except Exception as e:
        print("Exception: "+str(e))
        pass


def save_user_profile(sender, instance, **kwargs):
    print("save_user_profile")
    try:
        instance.profile.save()

    except Exception as e:
        print("Exception: "+str(e))
        pass

post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User)

Django-guardianは単一オブジェクトごとのアクセス許可管理であるため、単一のユーザー/グループに単一のオブジェクトへのアクセス許可を付与します。

完璧ですが、モデルグループに権限を追加しましたが、まだ機能していません

何が機能しないのですか?

この行:

#Assign permission for the groups
            assign_perm('can_add_member_custom', instance, group)
            print("assign_perm('can_add_member_custom', instance, group)")

インスタンスはユーザーオブジェクトですが、グループモデルに権限を追加し

# this is just required for easy explanation
    class Meta(GroupMixin.Meta):
        abstract = False
        permissions = (
            ('can_add_member_custom', 'Can Add Member Custom'),
        )

私はこのdjango-groups-managerを使用しました

私は愚かです、私は移行をして移行しなければなりません:

python3 manage.py makemigrations
python3 manage.py migrate

忍耐をありがとう👍@ ad-m

しかし、テンプレートビューで、どうすれば確認できますか?
これ:
jack.has_perm('change_group', admins)

djangoシェルでそれは機能します:
screen shot 2017-11-21 at 16 42 17

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

Dzejkob picture Dzejkob  ·  28コメント

David-OConnor picture David-OConnor  ·  6コメント

BenDevelopment picture BenDevelopment  ·  5コメント

brianmay picture brianmay  ·  16コメント

lukaszb picture lukaszb  ·  14コメント