扩展django-graphql-auth以限制用户名、密码和电子邮件

qgzx9mmu  于 2022-12-05  发布在  Go
关注(0)|答案(1)|浏览(161)

bounty将在7天后过期。回答此问题可获得+50的声望奖励。Homunculus Reticulli正在寻找标准答案

我使用的是Django 3.2版和django-graphql-auth 0.3.16版
我定义了一个自定义用户(和用户管理器),如下所示:
第1001章:我的models.py

class CustomUser(AbstractUser):
    USERNAME_FIELD='username'
    EMAIL_FIELD='email'
    # ...

    objects = CustomUserManager()

第1001章:我的managers.py

class CustomUserManager(BaseUserManager):
    # ...
    def create_user(self, email, password, **extra_fields):
        if not is_valid_email(email):
            raise ValueError(_('Bad email'))

        username = extra_fields.get('username')

        if not is_acceptable_username(username)):
            raise ValueError(_('You cannot use this username'))

        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()

        return user       

    def create_superuser(self, email, password, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError(_('Superuser must have is_staff=True.'))
        if extra_fields.get('is_superuser') is not True:
            raise ValueError(_('Superuser must have is_superuser=True.'))

        return self.create_user(email, password, **extra_fields)

第1001章:我的settings.py

# ....
AUTH_USER_MODEL='myapp.CustomUser'

第1001章:我的schema.py

import graphene
from graphql_auth import mutations
from graphql_auth.schema import MeQuery, UserQuery


class AuthMutation(graphene.ObjectType):
    register = mutations.Register.Field()
    verify_account = mutations.VerifyAccount.Field()

class Query(UserQuery, MeQuery, graphene.ObjectType):
    pass

class Mutation(AuthMutation, graphene.ObjectType):
    pass

schema = graphene.Schema(query=Query, mutation=Mutation)

我尝试通过以下变异注册一个新用户:

mutation {
  register(
        email: "memyself@somebad-domain.com",
      username: "badword1",
      password1: "1234",
      password2: "1234"
  ) {
    success
    errors
    token
  }
}

我得到了以下回应:

{
  "data": {
    "register": {
      "success": true,
      "errors": null,
      "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImJhZHdvcmQxIiwiZXhwIjoxNjY5OTEzNDIzLCJvcmlnSWF0IjoxNjY5OTEzMTIzfQ.TZ-copVrhUUsuLpozi18THjprGMnAGsBwpnyWORc16M"
    }
  }
}

预期的结果是GraphQL变异将根据电子邮件、用户名和密码返回一个失败代码-所有这些都被故意指定为被拒绝。
为什么django-graphql-auth不使用我的自定义管理器来创建对象-我该如何修复它,以便我可以实现自己的验证(例如,正确地检查/验证用户名和电子邮件)?

hfyxw5xn

hfyxw5xn1#

看起来您已经定义了自己的CustomUser模型和CustomUserManager,但是您没有在www.example.com文件中使用它们schema.py。为了使用您的自定义用户模型和管理器,您需要在schema.py文件中创建AuthMutation类时指定它们。
以下示例说明了如何在创建AuthMutation类时指定自定义用户模型和管理器:

import graphene
from graphql_auth import mutations
from graphql_auth.schema import MeQuery, UserQuery
from myapp.models import CustomUser
from myapp.managers import CustomUserManager

class AuthMutation(graphene.ObjectType):
    register = mutations.Register.Field(
        user_model=CustomUser,
        user_manager=CustomUserManager
    )
    verify_account = mutations.VerifyAccount.Field()

class Query(UserQuery, MeQuery, graphene.ObjectType):
    pass

class Mutation(AuthMutation, graphene.ObjectType):
    pass

schema = graphene.Schema(query=Query, mutation=Mutation)

通过在创建AuthMutation类时指定自定义的用户模型和管理器,django-graphql-auth将在处理register变量时使用您自定义的create_user和create_superuser方法的实现。这将允许在创建新用户时应用您自定义的验证。
我希望这对你有帮助!如果你有任何其他问题,请告诉我。

相关问题