【问题标题】:Implementing user type restrictions in my Django application在我的 Django 应用程序中实现用户类型限制
【发布时间】:2020-05-13 01:18:34
【问题描述】:

我一直在两个关于创建自定义用户模型的教程之间来回切换:

https://simpleisbetterthancomplex.com/tutorial/2018/01/18/how-to-implement-multiple-user-types-with-django.html

https://wsvincent.com/django-tips-custom-user-model/

到目前为止,这是我的代码:

型号:

class CustomUser(AbstractUser):
    is_admin = models.BooleanField('admin status', default=False)
    is_areamanager = models.BooleanField('areamanager status', default=False)
    is_sitemanager = models.BooleanField('sitemanager status', default=False)

表格:

class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm.Meta):
        model = CustomUser

class CustomUserChangeForm(UserChangeForm):

    class Meta(UserChangeForm.Meta):
        model = CustomUser

管理员:

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ['email', 'username',]

admin.site.register(CustomUser, CustomUserAdmin)

在这一点上我遇到了一些障碍。我不确定将内容限制为用户的方向。我的总体想法是,我希望管理员可以访问所有内容,区域经理拥有更高级别的访问权限,之后是站点管理员,然后是普通用户(所有布尔检查为 false)拥有基本权限。

这是实现这种实现的最佳途径吗?我应该从哪里开始,为什么?

【问题讨论】:

    标签: django django-models django-forms django-admin django-users


    【解决方案1】:

    不要扩展 AbstractUser、用户 Django 内置组和权限来创建具有不同权限的用户类: https://docs.djangoproject.com/en/3.0/topics/auth/default/#groups

    如果您需要向用户添加更多信息,常见的模式是创建 UserProfile:

    class UserProfile(models.Model):  
        user = models.OneToOneField(User, related_name='profile')
        address = models.CharField(max_length=140)  
        age = ...
    

    几个建议:

    • 仅在特定用例的情况下使用 AbstractUser(例如,当您需要自定义 AuthenticationBackend 时)
    • 在模型中使用用户 ID 而不是用户配置文件 ID 作为 FK(从请求中检索它更容易)
    • 对于基本用例,只需将“角色”字段添加到 UserProfile 即可实现简单的逻辑

    【讨论】:

    • 感谢您的回答。您能否扩展使用内置组功能?例如,如果我有一个包含 3 个信息部分的模板页面,并且我只希望管理员访问 3 个信息中的 2 个,其他人只访问 1 个。如果我将用户设置为 admin/user/manager,我将如何限制它们像上面这样的组?
    • 如果只有 admin/not-admin 组,我建议使用内置的 'is_staff' 属性。您可以为您的管理员用户将其设置为 True(注意:员工可以访问管理面板),然后在模板中隐藏按钮:{% if request.user.is_admin %}{% endif %}
    • 我想我会有 4 个组。或者可能是 3 个(Admin、SiteManager、AreaManager),默认状态为常规用户。这种实现在这种情况下是否可行?
    • 在这种情况下,您可以使用组和权限。它们帮助您限制对特定模型的访问以及用户如何添加/查看/更新/删除这些模型。在这篇文章中,你有一些很好的例子来说明如何在模板中使用这些规则:stackoverflow.com/questions/34571880/…希望这会有所帮助:)
    • 谢谢!这真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2011-02-18
    相关资源
    最近更新 更多