在 Django Rest Framework 中对来自我的网站的 Ajax 请求进行权限绕过
Posted
技术标签:
【中文标题】在 Django Rest Framework 中对来自我的网站的 Ajax 请求进行权限绕过【英文标题】:Make permission bypass for Ajax requests from my website in Django Rest Framework 【发布时间】:2021-01-18 22:33:33 【问题描述】:我已获得此 API 权限
def has_permission(self, request, view):
return request.user.is_authenticated and (
request.user.is_superuser or
models.AllowedToUseAPIList.objects.filter(user=request.user).exists()
)
我检查是否将请求 API 的用户添加到 AllowedToUseAPIList
列表中。
但我还需要从本网站的其他页面向此 API 发出 AJAX 请求。 如何更改权限以允许这样做?
我还将我的 CSRF 令牌传递给 AJAX 调用,但得到 403。
我这样进行 Ajax 调用:
let csrf = $("input[name='csrfmiddlewaretoken']").val();
...
$.ajax(
url:"% url 'api:ajax_api:save-mark' %",
method: 'POST',
data:
"csrfmiddlewaretoken": csrf,
"name": that.name,
"value": value,
,
success: function (data)
...
)
毕竟,我得到 403 Permission Denied。
【问题讨论】:
你能分享你的ajax请求和错误本身吗? @Daniel 查看编辑 csrf 令牌是否存在问题 - 是否正确传递?即错误是否说缺少或不正确的 csrf 令牌? @Daniel 是的,没错。问题不在于传递 csrf - 而是让我的权限绕过 Ajax 调用,但对任何其他用户保持真实。 不确定我是否仍然理解 - 但以下是绕过 csrf 令牌的一种方法。 【参考方案1】:尝试添加一个参数来告诉视图何时允许绕过:
js:
$.ajax(
url:"% url 'api:ajax_api:save-mark' %",
method: 'POST',
data:
"csrfmiddlewaretoken": csrf,
"name": that.name,
"value": value,
"bypass" : true, // add this parameter
,
success: function (data)
...
)
蟒蛇:
def has_permission(self, request, view):
# check if request was triggered by ajax:
ajax_bypass = 'bypass' in request.POST and request.POST['bypass']
# check if use is a superuser:
user_is_superuser = request.user.is_superuser
# check if user is in allowed list:
user_is_authorized = models.AllowedToUseAPIList.objects.filter(user=request.user).exists()
return ajax_bypass or user_is_superuser or user_is_authorized
【讨论】:
我认为没关系,但我得到了最好的解决方案 - 只是关闭可浏览的 API以上是关于在 Django Rest Framework 中对来自我的网站的 Ajax 请求进行权限绕过的主要内容,如果未能解决你的问题,请参考以下文章