验证用户名和密码后,登录时会将用户返回为no

时间:2019-02-12 04:36:04

标签: python django

虽然我使用身份验证功能对登录表单进行身份验证,但即使获得用户名和密码,我也没有用户身份。

public virtual async Task CreateSessionIdAsync(ClaimsPrincipal principal, AuthenticationProperties properties)
{
    if (principal == null) throw new ArgumentNullException(nameof(principal));
    if (properties == null) throw new ArgumentNullException(nameof(properties));

    var currentSubjectId = (await GetUserAsync())?.GetSubjectId();
    var newSubjectId = principal.GetSubjectId();

    if (!properties.Items.ContainsKey(SessionIdKey) || currentSubjectId != newSubjectId)
    {
        properties.Items[SessionIdKey] = CryptoRandom.CreateUniqueId(16);
    }

    IssueSessionIdCookie(properties.Items[SessionIdKey]);

    Principal = principal;
    Properties = properties;
}

private void IssueSessionIdCookie(string sid)
{
    if (Options.Endpoints.EnableCheckSessionEndpoint)
    {
        if (GetSessionIdCookieValue() != sid)
        {
            HttpContext.Response.Cookies.Append(
                Options.Authentication.CheckSessionCookieName,
                sid,
                CreateSessionIdCookieOptions());
        }
    }
}

在数据库端保存了登录凭据。我不知道这里出了什么问题。

这里的事件只不过是我创建的模型。

我已使用AbstractBaseUser,BaseUserManager更新了我的models.py并使用了超级用户凭据登录,但是它正在运行,但是当我使用单一表单创建用户时,登录无法正常工作,并且由于Manager不起作用而抛出错误可用“ auth.User”已交换为“ Provisioning.Event”

2 个答案:

答案 0 :(得分:1)

这根本不对。您不能只声明一个随机模型并期望它可用于身份验证。您需要继承AbstractBaseUser的子类并添加字段,在AUTH_USER_MODEL设置中声明模型,并在保存时适当地设置密码。

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager

class Event(AbstractBaseUser):
     ...

在settings.py中:

AUTH_USER_MODEL = 'myapp.Event'

现在,当您在视图中创建用户时,需要使用set_password对密码进行哈希处理:

p = Event(fname=fname, lname=lname, username=username)
p.set_password(password)
p.save()

此外,请注意,应在视图中处理对现有用户名的检查-如果使用ModelForm,这将自动发生。更好的是,使用django.contrib.auth.forms中的内置UserCreationForm。 (但是无论您做什么,请注意,根本不使用User模型进行过滤是完全没有意义的。)

答案 1 :(得分:0)

问题不在于调用authenticate,而可能在于实现自定义用户模型的方式。

使用自定义用户模型是完全可以的,并且非常有用,但是如果您想让自己更轻松,请让Django处理密码部分。

关于如何编写自己的用户模型,以及如何使其与内置Django功能(如身份验证:https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#specifying-a-custom-user-model

)保持良好配合,这是一本很好的指南。

之所以这样做是因为Django出于安全性考虑将哈希密码存储在数据库中。 Django处理密码的方式有很多细微差别。如果您有兴趣,这会非常吸引人:https://docs.djangoproject.com/en/2.1/topics/auth/passwords/#how-django-stores-passwords