从Django中删除(或隐藏)默认权限

Mar*_*rau 21 python django

我正在开发一个有两个管理后端的Django应用程序.一个用于"普通"用户的日常使用,默认用于更高级的任务和开发人员.

该应用程序使用一些自定义权限,但没有默认权限.所以我目前正在寻找一种方法来删除默认权限,或者至少是一种在没有大的修改的情况下将它们隐藏在"每日"管理员后端的方法.

BFi*_*Fil 18

更新:Django 1.7支持自定义默认权限

原始答案

以下内容适用于1.7版之前的Django

这是auth contrib应用程序的标准功能.

它处理post_syncdb信号并为每个模型创建权限(标准3:添加,更改,删除以及任何自定义权限); 它们存储在数据库的auth_permission表中.

因此,每次运行syncdb管理命令时都会创建它们

你有一些选择.没有什么是优雅的,但你可以考虑:

  1. 删除auth contrib应用程序并提供您自己的身份验证后端.

    后果 - >您将失去在auth用户模型之上构建的管理员和其他自定义应用程序,但如果您的应用程序是高度自定义的,那么可以为您提供一个选项

  2. 覆盖auth应用程序内的post_syncdb信号的行为(在\ django\contrib\auth\management__init __.py文件中)

    后果 - >请注意,如果没有基本权限,Django管理界面将无法工作(也可能是其他事情).

  3. 删除auth_permission表中每个模型的基本权限(添加,更改,删除)(手动,使用脚本或其他).

    后果 - >您将再次丢失管理员,并且每次运行syncdb时都需要删除它们.

  4. 构建您自己的权限应用程序/系统(使用您自己的装饰器,中间件等)或扩展现有的应用程序/系统.

    后果 - >无,如果你建好 - 这是我认为最干净的解决方案之一.

最后一个考虑因素:更改contrib应用程序或Django框架本身从来都不是一件好事:如果你需要升级到更新版本的Django,你可能会遇到麻烦.

所以,如果你想尽可能干净,可以考虑滚动你自己的权限系统,或者扩展标准权限(django-guardian是django权限扩展的一个很好的例子).它不会花费太多精力,您可以按照适合自己的方式构建它,克服标准django权限系统的限制.如果你做得很好,你也可以考虑开源它以使其他人能够使用/改进你的解决方案=)

  • 好吧,那我必须和他们一起生活。 (2认同)

pmd*_*row 16

我在这个问题上挣扎了一段时间,我想我已经想出了一个干净的解决方案.以下是隐藏Django的auth应用程序权限的方法:

from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from django import forms
from django.contrib.auth.models import Permission

class MyGroupAdminForm(forms.ModelForm):
    class Meta:
        model = MyGroup

    permissions = forms.ModelMultipleChoiceField(
        Permission.objects.exclude(content_type__app_label='auth'), 
        widget=admin.widgets.FilteredSelectMultiple(_('permissions'), False))


class MyGroupAdmin(admin.ModelAdmin):
    form = MyGroupAdminForm
    search_fields = ('name',)
    ordering = ('name',)

admin.site.unregister(Group)
admin.site.register(MyGroup, MyGroupAdmin)
Run Code Online (Sandbox Code Playgroud)

当然,可以轻松修改它以隐藏您想要的任何权限.如果这对您有用,请告诉我.


ode*_*den 11

Django 1.7中引入的新功能是定义默认权限的能力.如文档中所述,如果将其设置为空,则不会创建任何默认权限.

一个工作的例子是:

class Blar1(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, unique = True, blank = False, null = False, verbose_name= "Name")

    class Meta:
        default_permissions = ()
Run Code Online (Sandbox Code Playgroud)

  • 但是你不能使用这种方法来避免 Django 为自己的模型(如 Session)创建权限,它也不适用于第三方模型。 (2认同)
  • "你需要什么理由?" 我想在django权限之上使用我完全自定义的权限系统.当我显示管理员用户的所有权限列表时,例如,以便他可以为用户分配权限,我应该手动过滤掉django的内部权限.这太烦人了. (2认同)

小智 6

ShadowCloud给了一个很好的破坏.这是实现目标的简单方法.

在admin.py中添加以下行:

from django.contrib.auth.models import Permission
admin.site.register(Permission)
Run Code Online (Sandbox Code Playgroud)

您现在可以在管理员中添加/更改/删除权限.删除未使用的,当你有你想要的,然后返回并从admin.py中删除这两行.

正如其他人所提到的,后续的syncdb会把所有东西都放回去.