具有CustomUser的Django权限

2024-09-30 12:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用权限实现基于类的视图,但它们似乎没有连接,尽管我相信我严格遵守了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'会产生相同的结果
  • 当作为超级用户登录时,我当然会得到正确的页面

Tags: 用户importview视图权限modelsasrequired
2条回答

谢谢你的建议。 然而,仍然有一些事情我没有抓住。。。因此,我寻找了一种新的方法,并开始使用Oso,这是一个很棒的授权库。它工作得很好:Link to their WebSite

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

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

这是代码

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})

相关问题 更多 >

    热门问题