django - 使用 Django Allauth 在 Steam OpenID 身份验证中设置用户名
问题描述
我正在尝试配置一个新的 django 应用程序以使用 Steam 的 OpenID 身份验证。
我遇到的问题是,当新用户登录时(没有允许他们自定义用户名/指定电子邮件地址的表单),某些东西(allauth 或 django.contrib.auth)将其用户对象的用户名默认为user
. 该字段是唯一的......所以第二个用户无法登录。我无法弄清楚新用户对象的创建内容/位置,因此我们可以自定义该字段。理想情况下,我们希望它从 extra_data['personaname']) 中提取。
我已经将其追溯到 和 之间的某个allauth.socialaccount.adapter.populate_user
地方allauth.account.utils.user_username
。
填充用户只被调用一次,并且在那里打印locals()
会显示<User: Steam Username>
. 但是 user_username 被调用了五次,第一次是Steam Username
,但最后一次是 with user
。
解决方案
最终创建了我自己的用户模型来解决这个问题。
from django.contrib.auth.models import PermissionsMixin
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
class Player(PermissionsMixin):
date_joined = models.DateTimeField(_('date joined'), default=timezone.now, editable=False)
last_login = models.DateTimeField(_('last login'), blank=True, null=True, editable=False)
username = models.CharField(_('username'), max_length=128, unique=True)
REQUIRED_FIELDS=()
USERNAME_FIELD='username'
is_active = True
@property
def is_anonymous(self):
return False
@property
def is_authenticated(self):
return True
@property
def is_staff(self):
return self.is_superuser
@property
def steam_id(self):
return self.steam_account.uid
@property
def steam_account(self):
return self.socialaccount_set.get(provider='steam')
def set_unusable_password(self):
"""
This only exists for allauth.
"""
pass
def __str__(self):
return self.username
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from .models import Player
@admin.register(Player)
class PlayerAdmin(admin.ModelAdmin):
readonly_fields=('last_login','date_joined')
fieldsets = (
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
(_('Permissions'), {'fields': ('is_superuser', 'groups', 'user_permissions')}),
)
list_display = ('username', 'steam_id', 'is_superuser', 'date_joined', 'last_login', 'steam_id')
list_filter = ('is_superuser', 'groups')
ordering = ('username','last_login', 'date_joined')
filter_horizontal = ('groups', 'user_permissions',)
推荐阅读
- python-3.x - 如何从维基百科页面标题中获取页面 id
- microservices - 微服务数据库设计问题
- python - 如何使用python中的max函数获取变量的名称而不是变量中的数字
- javascript - 使用麦克风输入降低 Web 音频频谱分析仪的采样率
- javascript - 如何在谷歌图表中使用 php 循环
- json - 如何使用 Swift 访问这个 JSON 字典中的特定值?
- google-chrome - 谷歌浏览器无法在 Mac 上安装
- i3 - 键绑定到关机电脑
- javascript - Javascript - 为导出的类创建事件侦听器
- cookies - 移动 Safari:iframe 缺少 cookie