【问题标题】:Predefined django groups with custom permissions具有自定义权限的预定义 django 组
【发布时间】:2018-08-06 08:09:48
【问题描述】:

我提前知道将是哪些用户组。在开发过程中,我们经常重置数据库,这是显而易见的。但是我想知道将这些信息放在哪里以及何时将其放入数据库的最佳位置是因为我不想每次都通过 django admin 手动执行此操作。

我想出这样的事情:

我有简单的烫发图,在此基础上我通过函数将所需的信息放入数据库。

GROUP_PERMISSION_MAP = {
    user_constants.GROUPS.ADMINISTRATORS: {
        Bet: ['add', 'change', 'delete'],
        Transaction: [],
        User: ['add', 'change'],
        Category: ['add', 'change', 'delete'],
        BetInfo: ['add', 'change', 'delete'],
    },
    user_constants.GROUPS.REGULAR_USERS: {
        Bet: ['add'],
        Transaction: [],
        User: ['change'],
        Category: [],
        BetInfo: ['add', 'change', 'delete'],
    }
}


def assign_perms_to_group(group: Group, model: Model, permissions: List[str]):
    permission_codenames = ['{}_{}'.format(permission, model.__name__.lower()) for permission in permissions]
    group.permissions.add(*Permission.objects.filter(codename__in=permission_codenames))

最佳做法是什么?应该如何做?

特别是我的问题是:

  1. 这个具有权限的预定义组应该放在哪里(也许存在一些更好的方法)?
  2. 将其放入数据库的最佳方式和时间是什么?

【问题讨论】:

    标签: django python-3.x permissions


    【解决方案1】:

    这听起来像是您可以使用 Django fixturesmigrations 的情况。

    在一个特定项目中,我还使用了custom admin command 来确保存在一些初始数据,因为在那种情况下,固定装置并不能完全满足我的需要。

    例如,我的ensure_auth_data 命令看起来像这样:

    class Command(BaseCommand):
        help = 'Creates superuser, permissions and groups.'
    
        def _ensure_superuser(self):
            u_created = False
            u_updated = False
            try:
                usr = User.objects.get(username='ralf')
            except User.DoesNotExist:
                usr = User()
                usr.username = 'ralf'
                u_created = True
    
            if not usr.is_active:
                usr.is_active = True
                u_updated = True
            if not usr.is_superuser:
                usr.is_superuser = True
                u_updated = True
    
            if u_created or u_updated:
                usr.save()
    
            if u_created:
                self.stdout.write('Created superuser "{}"'.format(usr.username))
            elif u_updated:
                self.stdout.write('Updated superuser "{}"'.format(usr.username))
            else:
                self.stdout.write('Superuser "{}" already up to date'.format(usr.username))
    
        ... some other methods here ...
    
        def handle(self, *args, **options):
            self.stdout.write('Starting command')
            self.stdout.write('...')
            self._ensure_superuser()
            self.stdout.write('...')
            self._ensure_permissions()
            self.stdout.write('...')
            self._ensure_groups()
            self.stdout.write('...')
            self.stdout.write('Command finished')
    

    【讨论】:

    • 不幸的是,由于Permission 对象是在迁移后创建的(我需要将它们分配给特定组),因此我无法在迁移中执行此操作。夹具也不是解决方案,因为我没有 Permission 对象的主键,这些 pk 可能会有所不同。
    • 嗯...在这种情况下,您可以使用自定义管理命令来检查用户是否具有所需的权限,如果没有,则分配给他们。
    • 这个命令应该是幂等的,这样你就可以多次调用它而不会有副作用的风险,并且保证在调用之后你总是会获得分配给指定用户的所需权限。跨度>
    • 我已经按照您的建议使用自定义命令完成了该操作。我找不到其他解决方案。也许你在那段时间发现了什么?
    • @Symonen 现在我以这种方式使用它(只是在我的答案中添加了示例代码)。如果它对您有帮助,如果您支持或接受我的回答,我将不胜感激。
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多