pythonpython-3.xpython-repydantic

Password validation with pydantic


To avoid using an if-else loop, I did the following for adding password validation in Pydantic.

    @field_validator("password")
    def check_password(cls, value):
        # Convert the password to a string if it is not already
        value = str(value)

        # Check that the password meets the criteria
        if len(value) < 8:
            raise ValueError("Password must have at least 8 characters")

        if not any(c.isupper() and c.islower() and c.isdigit() and c in string.punctuation for c in value):
            raise ValueError("Password must have at least one uppercase letter, one lowercase letter, and one digit")

        return value

But unfortunately that if not any condition is not working correctly. How can I fix it?


Solution

  • There is no character that is simultaneously upper, lower, a digit, and a punctuation.

    You need:

    if not any(c.isupper() for c in value) or \
       not any(c.islower() for c in value) or \
       not any(c.isdigit() for c in value) or \
       not any(c in punctionation for c in value): 
      ... handle bad password ...