【问题标题】:Custom Authentication with Custom User in django?在 django 中使用自定义用户进行自定义身份验证?
【发布时间】:2016-07-05 16:16:23
【问题描述】:

我知道https://docs.djangoproject.com/en/1.9/topics/auth/customizing/ 这里有这个问题的文档,但是我需要澄清一下我的用例。

我基本上有一个我创建的 api。这个 api 所做的是将用户表单数据提交到外部 url,一旦提交,数据就会保存到外部 urls 数据库中。

然后我可以通过另一个 api 调用获取特定用户。用户作为对象返回。现在我正在尝试通过我的系统使用 django.contrib.auth 登录该用户,但我所拥有的不起作用。

这是我的过程:

A.我在我的 settings.py 文件中添加了一个自定义身份验证后端

AUTHENTICATION_BACKENDS =(
    'new_app.backends.SettingsBackend',
    'django.contrib.auth.backends.ModelBackend',
)

B.在我的 new_app 的后端文件中,我有以下代码:

class SettingsBackend(object):
    def authenticate(self, username=None, password=None):
            if username and password:
                user = api.get_user()
                #add pk to user object to satisfy django error warning
                user.pk = user.unique_field
                return user
            return None

    def get_user(self, user_id):
        try:
            if self.user.pk == user_id:
                return self.user
        except:
            return None

在登录视图中,我正在尝试使用此登录用户:

def login_user(request, username, password):
    from django.contrib import auth 
    if not username and password:
        raise ValueError("Invalid username and password")

    auth_user = auth.authenticate(username=username, password=password)

    if auth_user is None:
        raise ValueError("Invalid username and password")

    auth.login(request, auth_user)
    return auth_user

我收到错误消息:

'api.get_user()' object has no attribute 'save'

auth.login(request, auth_user) 行发生错误。

我认为原因是因为 django.contrib.auth 认为我的用户对象是 django 模型。所以,问题是我应该如何解决这个问题以使其在我的情况下发挥作用?谢谢你的时间。

【问题讨论】:

  • 您在设置中说明了更改的用户模型吗?
  • @RA123 感谢您的回复。我没有,因为这不是典型的 django 用户模型,所以我认为这不是必需的。我觉得我很接近,但也许不需要使用 django.contrib.auth 并制作我自己的身份验证方法,但这就是我需要一些指导的地方。
  • 如果你不使用django的用户模型,请先设置AUTH_USER_MODEL = 'user_custom.MyUser'
  • @RA123 谢谢,但这不起作用。这是从 api 调用获得的用户对象,我的应用程序模型文件中没有自定义用户模型。我什至没有使用模型文件,因为一切都来自外部数据库。我希望这是有道理的
  • 您不能使用登录方法,因为它会在定义的任何用户数据库中查找用户 ID(如果没有则默认)以创建/继续会话。因此它需要一个用户模型类。

标签: python django authentication


【解决方案1】:

我不是 django 微妙之处的专家(因为我离开 django 从事微框架已经有一段时间了)。

也就是说,如果我是你,我要做的是确保无论 api.get_user() 返回什么,实现 django 对该对象期望的任何 API,这意味着从一个空的 save() 方法开始.

但我也会做标准的 django 东西,就像 @RA123 在评论中建议的那样,通过设置 AUTH_USER_MODEL 向上。

【讨论】:

  • 感谢您的意见!现在正在调查。当我有它的工作时会发布答案。
猜你喜欢
  • 1970-01-01
  • 2012-05-06
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
相关资源
最近更新 更多