覆盖django管理员身份验证

时间:2019-02-22 17:01:54

标签: python django django-admin django-authentication

我正在使用Django 2.1.5。我想覆盖django管理员身份验证过程,目标是允许is_staff = False的用户登录。因此,我正在尝试覆盖AdminSite,并遵循此文档(https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#overriding-default-admin-site)。到目前为止,这是代码:


my_app / forms.py

from django.contrib.admin.forms import AdminAuthenticationForm

class CustomAdminAuthenticationForm(AdminAuthenticationForm):

    def confirm_login_allowed(self, user):
        super().confirm_login_allowed(user)   # i removed is_staff checking here

my_app / admin.py

class MyAdminSite(admin.AdminSite):
    login_form = CustomAdminAuthenticationForm

    def has_permission(self, request):
        return request.user.is_active   # i also removed request.user.is_staff here

my_app / apps.py

from django.contrib.admin.apps import AdminConfig

class MyAdminConfig(AdminConfig):
    default_site = 'my_app.admin.MyAdminSite'

root / settings.py

INSTALLED_APPS = [
    'my_app.apps.MyAdminConfig',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'my_app',
]

当我尝试运行服务器时,出现错误:

ImportError: Module "my_app.admin" does not define a "MyAdminSite" attribute/class

我认为我已经正确地将default_site指向my_app / apps.py。我怎样才能解决这个问题?除了覆盖AdminSite之外,还有其他方法可以完成我的目标吗?谢谢。

1 个答案:

答案 0 :(得分:0)

这似乎很麻烦,而不仅仅是给每个用户分配职员角色。 Django docsis_staff中将User字段定义为一个布尔值,表示“ [d]表示此用户是否可以访问管理站点”。这不是你想要的吗?

换句话说:如果您希望所有用户都可以访问管理网站,您还需要is_staff阻止您将所有用户都变成工作人员吗?