skip to Main Content

What I am trying to do is to validate that the password added by the user does not contain the username the they chose. On the frontend I do the validation with Yup and right know I have something like this:

export const schema = Yup.object({
  username: Yup.string()
    .required("Username is required")
    .matches(
      /^[a-zA-Z0-9_-]+$/,
      "The username should contain only alphanumeric characters, underscores and hyphens"
    ),
  password: Yup.string()
    .required("Password is required")
    .matches(
      /^(?=.*?[A-Z])(?=.*[a-z])(?=.*d)(?=.*W).{8,}$/,
      "The password should contain upper and lowercase letters, numbers and special characters"
    )
    // Here I should somehow check if the username value is used (maybe like this?)
    .matches(
      /^(?=.*?[A-Z])(?=.*[a-z])(?=.*d)(?=.*W)(?!.*[{username}]).{1,}$/,
      "The password should not contain the username"
    )
});

I probably already do this wrong (with the username check part at least) so any other idea or suggestion on how to do this would be appreciated. Thanks!!

2

Answers


  1. Your should try this:

    export const schema = Yup.object({
      username: Yup.string()
        .required("Username is required")
        .matches(
          /^[a-zA-Z0-9_-]+$/,
          "The username should contain only alphanumeric characters, underscores and hyphens"
        ),
      password: Yup.string()
        .required("Password is required")
        .matches(
          /^(?=.*?[A-Z])(?=.*[a-z])(?=.*d)(?=.*W).{8,}$/,
          "The password should contain upper and lowercase letters, numbers and special characters"
        )
        .test({
          name: 'username-check',
          message: 'Your error message',
          test: (value, ctx) => !value.includes(ctx.parent.username)
        }),
    });
    
    Login or Signup to reply.
  2. You can use Yup ref and notOneOf to achieve this

    import * as Yup from "yup";
    
    const schema = Yup.object({
      username: Yup.string()
        .required("Username is required")
        .matches(
          /^[a-zA-Z0-9_-]+$/,
          "The username should contain only alphanumeric characters, underscores and hyphens"
        ),
      password: Yup.string()
        .required("Password is required")
        .matches(
          /^(?=.*?[A-Z])(?=.*[a-z])(?=.*d)(?=.*W).{8,}$/,
          "The password should contain upper and lowercase letters, numbers and special characters"
        )
        // Here I should somehow check if the username value is used (maybe like this?)
        .notOneOf([Yup.ref('username'), null], "The password should not contain the username")
     
        
    });
    
     const obj = {
      username: 'abc',
      password: 'assscdF3$'
    }
    
    console.log(schema.validateSync(obj, {returnError: true}))
    
    const obj2 = {
          username: 'assscdF3$',
          password: 'assscdF3$'
        }
        
        console.log(schema.validateSync(obj2, {returnError: true})) 
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search