【问题标题】:Whats the correct way to programmatically add permissions to a group以编程方式向组添加权限的正确方法是什么
【发布时间】:2013-01-04 09:29:42
【问题描述】:

我想向组添加(已经存在,通过元标记中的权限定义)权限并寻找正确的位置。我必须确保在 sync_db 命令之后所有组都分配了正确的权限。

我想连接一个 post_syncdb 信号,但信号文档说:

重要的是这个信号的处理程序执行幂等 更改(例如,没有数据库更改),因为这可能会导致刷新 如果它也在 syncdb 命令期间运行,则管理命令将失败。

因此,可能不建议有人在通过 sync_db_post 信号调用的管理命令中向组添加权限。

我打算这样设置权限:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    company = models.ForeignKey(Company, related_name='user_profiles')
    department = models.ForeignKey(Department, related_name='user_profiles')

    class Meta:
        permissions = (
            ('admin_section_access', 'Access to front-end admin section'),
        )

在管理命令中:

from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType


class Command(BaseCommand):
    args = 'none'
    help = 'Sets the defined group permissions'

    def handle(self, *args, **options):
        front_end_admin_group, created = Group.objects.get_or_create(name="Front End Admin")

        #get the content type for the UserProfile model
        user_profile_ct = ContentType.objects.get(app_label='organization', model='userprofile')
        admin_section_access_perm = Permission.objects.get(content_type=user_profile_ct, codename="admin_section_access")
        front_end_admin_group.permissions.add(admin_section_access_perm)
        self.stdout.write('Successfully setup group permissions.')

【问题讨论】:

  • 这个操作看起来很静态,所以简单的 initial_data 固定可能对你有用。如果不是,您在上面演示的自定义命令方法很合适。为了防止发生意外,我会连接 post_save 和 pre_delete 组信号,并确保“前端管理员”组永远不会被删除,并且不会删除关键权限。
  • 你可能是对的。谢谢。

标签: django permissions


【解决方案1】:

这里有两个主要选项。第一个是为您的数据库创建一个固定装置,如 Django 文档中的here 所述。这是将数据(对您而言,权限外部参照记录)植入数据库的最古老方法。

第二个选项,我更喜欢第一个选项,是使用South 以编程方式跟踪和维护对数据库的更改。虽然最常用于架构更改,但其data migrations 功能是处理您想要的完美的地方。您可以在命令行中运行它:./manage.py datamigration my_app seed_permissions,然后只需在提供的forwards 函数中编写获得权限所需的 Django 代码。

第二个选项的主要问题是它要求您在sync_db 之后运行migrate 的附加命令,但这可能是不可避免的,因为South 是事实(并计划在1.7 中成为核心Django) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多