【问题标题】:Django Permissions with CustomUser带有 CustomUser 的 Django 权限
【发布时间】:2021-07-12 11:44:36
【问题描述】:

我正在尝试使用权限实现基于类的视图,但它们似乎没有连接,尽管我相信我严格遵循 Django 用户指南。 第一:在accounts.models中建立一个基于代理的自定义用户模型

class CustomUser(AbstractUser):
 some_fields...

然后,我创建了一个经理:

class EmployeeManager(models.Manager):
    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(status_type=CustomUser.StatusType.EMPLOYEE)

后跟配置文件类型:

class Employee(CustomUser):
    objects = EmployeeManager()

    class Meta:
        proxy = True
        permissions = [("communities.view_region", "Can view region")]

在我设置权限的地方,进行迁移并迁移。 之后,我创建了视图:

import communities.models as comms

class RegionsListView(ListView):
    model = comms.Region

然后,配置url及其视图:

rom django.urls import path, include
import communities.views as views
from django.contrib.auth.decorators import permission_required

app_name = 'communities'

urlpatterns = [
    path("regions/list/", permission_required("communities.view_region")(views.RegionsListView.as_view()))

然后我以员工身份登录,调用此 url 时收到错误 403。

我错过了什么? 备注:

  • 在 view.py 文件中使用 permission_required = 'communities.view_region' 会产生相同的结果。
  • 以超级用户身份登录时,我当然会得到正确的页面。

【问题讨论】:

  • 我怀疑您的员工没有 view_region 权限。 :)
  • 是不是说我调用Permission模型的时候有问题? >>> content_type = ContentType.objects.get_for_model(Employee, for_concrete_model=False) >>> employee_permissions = Permission.objects.filter(content_type=content_type) >>> [p.codename for p in employee_permissions] ['add_employee', 'change_employee', 'communities.view_region', 'delete_employee', 'view_employee', 'view_list_regions'] 因为权限显示...我完全不解。
  • 您展示了员工可能拥有的权限。但是,在新创建的员工能够使用这些权限之前,您需要先授予它们。我的猜测是您忘记向新创建的员工授予权限,我会检查您用于测试的员工帐户的实际权限。
  • 非常感谢您的回复。我可以继续通过管理界面为用户设置一个组。但是,在使用自定义视图和模板创建用户时,我怎样才能达到相同的结果?如果我在与组的一对多关系中创建一个“组”字段,它会考虑到它,但是它确实实现了组,我必须在管理页面中再次这样做......
  • 1) Groups 使用ManyToMany 关系链接到用户,我相信AbstractUser 模型链接到Django Group 模型,不需要自己做任何事情。 2) 用户创建是在 UserManager 中定义的,这里的例子是docs.djangoproject.com/en/3.2/topics/auth/customizing/…,你可以在这里定义一个方法,比如说,create_employee 或重新定义 create_user 方法。

标签: python django django-views permissions


【解决方案1】:

感谢您的建议。 但是还有一些我没有抓住的东西......因此我搜索了一种新方法并开始使用 Oso,这是一个很棒的授权库。而且效果很好:Link to their WebSite

【讨论】:

    【解决方案2】:

    为了实现权限,必须在创建新用户时以编程方式完成。 在工作流程中,

    • 新用户会收到一封带有唯一链接的激活电子邮件,
    • 点击使他能够访问该网站,并要求他立即更改密码,
    • 验证实现权限(在本例中为组)

    这里是代码。

    from django.contrib import messages
    from django.contrib.auth import update_session_auth_hash
    from django.contrib.auth.forms import PasswordChangeForm
    from django.shortcuts import redirect, render
    from django.contrib.auth.models import Group
    
    @login_required
    def change_password(request):
        if request.method == "POST":
            form = PasswordChangeForm(user=request.user, data=request.POST)
            if form.is_valid():
                user = form.save()
                # Attributes to a user a group depending on his status.
                user.groups.add(Group.objects.get(name=user.status_type))
                update_session_auth_hash(request, user)  # Important!
                messages.success(request, 'Your PWD has been changed')
                return redirect('change_password')
            else:
                messages.error(request, 'Please Correct the Error')
        else:
            form = PasswordChangeForm(request.user)
        return render(request, 'accounts/change_password.html', {'form': form})
    

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 2020-02-02
      • 2011-01-12
      • 1970-01-01
      • 2012-02-18
      • 2015-04-21
      • 2019-07-13
      • 2016-11-10
      • 1970-01-01
      相关资源
      最近更新 更多