我试图创建一个CustomUserViewset,并添加一个login_user API到它。问题是,尽管我将permission_classes
设置为AllowAny
,但在调用login_user API时,它仍然显示:{"detail":"Please login to perform this action"}
。
以下是我的API:
class CustomUserViewset(AutoPermissionViewSetMixin, viewsets.ModelViewSet):
queryset = User.objects.none()
serializer_class = CustomUserSerializer
permission_type_map = {
"create": "add",
"destroy": "delete",
"partial_update": "change",
"retrieve": "view",
"update": "change",
"register": "view",
"login_user": "view",
"logout": "change",
}
@decorators.action(methods=["POST"], detail=False, permission_classes=[permissions.AllowAny])
def login_user(self, request):
serializer = LoginSerializer(data=request.data)
if not serializer.is_valid():
raise exceptions.ValidationError({"detail": "Invalid username or password"})
username = serializer.validated_data["username"]
password = serializer.validated_data["password"]
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return Response(CustomUserSerializer(user).data, status=status.HTTP_200_OK)
else:
raise exceptions.AuthenticationFailed({"detail": "Invalid username or password"})
字符串
正如你所看到的,我在API action中有permission_classes=[permissions.AllowAny]
。此外,在action中赋予此权限类是我尝试的最后一件事,在此之前,我尝试在rules.py中调整权限:
import typing
import rules
if typing.TYPE_CHECKING:
from .models import User
rules.add_perm("accounts.login_user", rules.predicates.always_allow)
型
以上方法都不起作用,我仍然得到相同的消息,我需要登录才能执行此操作。
2条答案
按热度按时间zf9nrax11#
我解决了这个问题,首先向
permission_type_map
添加了一些权限,然后调整了rules.py:字符串
在rules.py中:
型
现在有了这些新的权限和规则,所有三个API都可以按预期工作。
niknxzdl2#
也许装饰器没有正确地覆盖它,但我不能确认它。但这里有另一种替代方法可以使用。下面的例子将登录名分离到另一个类,这样访问权限就不会混淆,它只处理一件事。
首先,创建自定义视图集以仅处理此登录:
字符串
然后手动调用它在你的
project/urls.py
像这样:型
不要忘记更新你的导入路径或者登录的核心代码,因为我的是djangorestframework-simplejwt。这只是一个例子,但是它工作正常。