1

我将我的 Django 应用程序部署到远程服务器上,但 sweetpie 无法识别远程服务器上的登录用户。

我有一个美味的资源,可以过滤属于当前登录用户的所有对象:

  def apply_authorization_limits(self, request, object_list):
    return object_list.filter(user=request.user)

当我尝试在端点上为对象执行 GET 请求时,出现以下错误:

int() argument must be a string or a number, not 'AnonymousUser

我猜是因为登录没有正常工作?

还是做到了?在模板页面上,我有以下代码:

{% if user.is_authenticated %}
  Logged in as <strong>{{ user.username }}</strong>
  <a href="/users/logout">Logout</a>
{% else %}
  <a href="/users/signup">Signup</a>
  <a href="/users/login">Login</a>
{% endif %}

并且代码正确显示了用户的用户名(这意味着用户已通过身份验证)。会发生什么?在我的本地服务器上,我能够成功地向tastypie API 发出所有HTTP 请求,并且我不被称为AnonymousUser,但在我的远程服务器上,我被称为AnonymousUser to Tastypie

编辑:当我在任何视图中有一个打印语句打印出 request.user 时,我得到了正确的登录用户。当我在我的 Tastypie api.py 中有一个打印出 request.user 的语句时,我就被称为 AnonymousUser。为什么我会被 Tastypie 称为 AnonymousUser 而不是应用程序的其余部分?

编辑:我正在使用以下身份验证:

authentication = Authentication()

如果我将身份验证更改为 ApiKeyAuthentication,那么我必须将每个 GET/POST 请求上的用户名和 api 密钥发布到资源。这样做的问题是我必须创建一个新的中间视图来查询用户名和视图,然后对 Tastypie 端点执行 GET/POST。有没有另一种解决方案?第二种方法是将用户名和 apikey 嵌入到 webapp 中,让 JS 获取这些值并将它们添加到 GET/POST 查询字符串中,但这可能会导致安全问题。这将是一个安全问题,因为如果用户拥有用户名和 api 密钥,他们可以假装是另一个用户。

4

1 回答 1

1

第一:APIKeyAuth:就像另一个用户通过不安全的连接获取用户名和密码或会话 ID 一样,这是一个很大的问题。

第二:如果您想使用基于会话的身份验证(它仅适用于浏览器,适用于当前登录的用户)您需要创建自己的身份验证后端,详细信息请参见http://django-tastypie.readthedocs .org/en/latest/authentication_authorization.html#implementing-your-own-authentication-authorization

不过,从那里向上滚动一点,然后阅读有关您选择的身份验证方法的令人讨厌的警告。

于 2012-05-09T03:43:43.950 回答