我已经为基于令牌的身份验证实现了 simpleJWT。我创建了一个简单的 hello world 测试 API。
在测试时,我正在使用 /rest-auth/login/ 进行日志记录并用于生成使用 /api/token/ - 两者都可以正常工作。
现在进行测试,我使用用户 XYZ(拥有 helloworld api 的访问权限)登录并使用另一个用户 ABC(没有 helloworld api 的访问权限)生成令牌。
所以现在用户 XYZ 已通过身份验证(好的),但我有用户 ABC 的令牌(好的)。
现在,当我使用为使用 ABC 生成的令牌调用 API 时,即使用户 ABC 对 API 没有权限,我也可以访问 helloworld api!因为拥有权限的用户 XYZ 已经登录。
问题是当多个用户将使用该站点时,总是会出现这种情况。如何解决?下面还介绍了一些代码片段:
我的 settings.py 被剪断了
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
代码基本上是一个为用户进行身份验证的装饰器如下
def user_is_ADM(fun_c):
@wraps(fun_c)
def wrapped(request, *args, **kwargs):
# 1 = ADM
if(request.user and request.user.is_authenticated) : <--- here is the issue
user_data = UserProfile.objects.get(user_id = request.user.id)
# user profile as as a user type
u = user_data.user_type
if u == 1:
return fun_c(request, *args, **kwargs)
else:
raise PermissionDenied
return wrapped
在这种情况下我的策略应该是什么?
编辑 如下修改了我的装饰器,它正在工作。如果我做错了什么,请有人评论
def user_is_ADM(fun_c):
@wraps(fun_c)
def wrapped(request, *args, **kwargs):
juser = get_user(request)
if juser.is_authenticated:
user_jwt = JWTAuthentication().authenticate(Request(request))
if user_jwt is not None:
if request.user == user_jwt[0]:
k = user_jwt[0].userprofile.get_user_type_display()
if k == 'ADM':
return fun_c(request,*args,**kwargs)
else:
raise PermissionDenied
else:
raise PermissionDenied
else:
raise PermissionDenied
else:
raise PermissionDenied
return wrapped