虽然我使用身份验证功能对登录表单进行身份验证,但即使获得用户名和密码,我也没有用户身份。
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”
答案 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