我的用户拥有以下权限:
add_client, view_client, delete_client, change_client
Client
模型print(user.request.user_permissions.all())
给出 @permission_required("client.add_client",login_url="/login")
def add_client(request):
...
@permission_required("client.view_client",login_url="/login")
def view_client(request):
...
用户无法打开页面并被重定向到登录页面(/login)
user.has_perm("client.add_client")
和 user.has_perm("client.view_client")
返回 False您遇到的问题是,尽管用户拥有必要的权限,但用户仍被重定向到登录页面,这可能是由多种原因造成的。让我们通过系统的方法来排查并解决这个问题:
正确的权限代号:确保 @permission_required 装饰器中使用的权限代号与数据库中的权限代号匹配。 Django 中的权限通常以
用户认证:在检查权限之前验证用户确实经过认证。如果用户因某种原因未通过身份验证,他们将被重定向到登录页面。您可以添加打印语句或调试来检查 request.user.is_authenticated 是否返回 True。
用户权限:确认用户确实拥有分配的权限。您可以在 Django 管理中心或通过 shell 进行检查。权限有时可能很棘手,特别是如果未正确分配权限或希望用户通过组获得权限。
中间件:确保 AuthenticationMiddleware 和 PermissionMiddleware 正确放置在您的 MIDDLEWARE 设置中。如果没有这些,权限系统可能无法按预期运行。
装饰器的使用:确保您正确使用装饰器。您提供的语法似乎是正确的,但最好重新检查一下:
from django.contrib.auth.decorators import permission_required
@permission_required('client.add_client', login_url='/login')
def add_client(request):
...
调试:添加调试语句以了解故障发生在哪里。检查用户是否经过身份验证、是否具有正确的权限以及装饰器是否按预期触发。
超级用户测试:使用超级用户帐户测试功能。如果超级用户可以在不被重定向的情况下访问该功能,则问题可能在于如何为普通用户分配或识别权限。
权限缓存:请记住,权限是被缓存的。如果您最近更改了权限,您可能需要注销并重新登录才能看到更改生效。
模型权限:确保权限与正确的模型关联。在您的情况下,像 add_client 这样的权限应该与客户端模型相关联。有时,如果权限设置不正确或与错误的模型关联,可能会导致问题。
如果您已检查所有这些方面并且问题仍然存在,您可能需要提供更多上下文或代码片段以供进一步调查。但通常情况下,这些步骤之一应该可以帮助您识别并解决导致重定向到登录页面的问题,尽管您拥有正确的权限。