0

我正在尝试将 Django 与非 ORM 数据源一起使用,并且通过我的自定义后端访问其他资源而无需任何身份验证是成功的,现在我需要引入用户身份验证。没有本地数据库。当我收到一个请求(例如,一个使用用户名和密码的 cURL 命令)时,我需要对远程 URL 执行 HTTP 基本身份验证,成功后,我应该返回一个本地创建的用户对象,它只有一个用户名,没什么特别的. 所以在我的 Tastypie 资源中,我写了这样的内容:

class dict2obj(object):
    """
    Convert dictionary to object
    @source http://stackoverflow.com/a/1305561/383912
    """
    def __init__(self, d):
        self.__dict__['d'] = d

    def __getattr__(self, key):
        value = self.__dict__['d'][key]
        if type(value) == type({}):
            return dict2obj(value)
        return value


class RemoteAuth(Authentication):
    def is_authenticated(self, request, **kwargs):
        username = request.user.username
        password = request.user.password
        r = requests.get(AUTHENTICATION_URL, auth=(username, password))
        if r.status_code == 200:
          return True
        return False



class UserResource(Resource):             
    username = fields.CharField(attribute='username')

    class Meta:
        resource_name = 'user'
        authentication = RemoteAuth()
        authorization = Authorization()

        def obj_get_list(self, request=None, **kwargs):

            result = []

            posts.append(dict2obj(
            {
            'username': request.POST.get('username'),
            }
            ))

            return result   

但这当然是行不通的,因为身份验证对象无法获得这样的密码。请提出一种在不涉及任何本地数据库的情况下处理删除用户身份验证的好方法。

4

1 回答 1

0

如果您希望在不存储任何实际数据的情况下进行用户身份验证,那么您可以使用session或作为最后的手段,cookies. 会话数据可以加密并存储在会话 cookie 本身或侧 cookie 中。

那将如何运作?

您可以创建一个端点,例如api/v1/user/login,作为UserResource处理用户身份验证/登录的方法。你可以这样做:

def override_urls(self):
    return [
        url(r"^(?P<resource_name>%s)/login%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('user_login'), name="api_user_login"),
    ]

def user_login(self, request, **kwargs):
    # Authentication process happens here.
    return self.create_response(request, {})

要使上述工作正常,您必须导入tastypie.utils.trailing_slashdjango.conf.urls.url. 不幸的是,tastepie 不支持任何帮助方法来减少创建 url 的痛苦。

然后,在该user_login方法中,您将对通过POST远程端点传递的凭据进行身份验证,并将用户名和密码request.session与任何远程身份验证端点特定的数据一起存储。然后,RemoteAuthentication您可以检查会话密钥是否存在。

如果会话是本地文件系统中的数据,那么可以认为里面的数据更安全一些。如果您决定将会话数据存储在加密的 cookie 中,则必须为每个会话密钥存储一个值和一个校验和,可能在单个 cookie 条目或单独的条目中。

由于用户将以纯文本形式传递他们的凭据以登录,因此您可以考虑user_login通过 SSL 提供视图(确保 cookie 不在secure_only那时)。

于 2013-10-09T15:42:38.067 回答