PasswordPolicyValidator.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System.Linq;
  2. using Application.Features.Config.Get;
  3. using SharedKernel.Results;
  4. namespace Application.Helpers;
  5. public static class PasswordPolicyValidator
  6. {
  7. public static Result Validate(string password, Response.AccountConfigDto config)
  8. {
  9. if (string.IsNullOrWhiteSpace(password))
  10. {
  11. return Result.Failure(Error.Problem("Auth.PasswordRequired", "비밀번호는 필수입니다."));
  12. }
  13. // 최소 길이 검증 (config 없으면 기본 6자)
  14. var minLength = config.PasswordMinLength ?? 6;
  15. if (password.Length < minLength)
  16. {
  17. return Result.Failure(Error.Problem("Auth.PasswordTooShort", $"비밀번호는 {minLength}자 이상이어야 합니다."));
  18. }
  19. // 대문자 검증
  20. if (config.PasswordUppercaseLength is > 0)
  21. {
  22. var uppercaseCount = password.Count(char.IsUpper);
  23. if (uppercaseCount < config.PasswordUppercaseLength)
  24. {
  25. return Result.Failure(Error.Problem("Auth.PasswordUppercase", $"비밀번호에 영문 대문자가 {config.PasswordUppercaseLength}자 이상 포함되어야 합니다."));
  26. }
  27. }
  28. // 숫자 검증
  29. if (config.PasswordNumbersLength is > 0)
  30. {
  31. var numberCount = password.Count(char.IsDigit);
  32. if (numberCount < config.PasswordNumbersLength)
  33. {
  34. return Result.Failure(Error.Problem("Auth.PasswordNumbers", $"비밀번호에 숫자가 {config.PasswordNumbersLength}자 이상 포함되어야 합니다."));
  35. }
  36. }
  37. // 특수문자 검증
  38. if (config.PasswordSpecialcharsLength is > 0)
  39. {
  40. var specialCount = password.Count(c => !char.IsLetterOrDigit(c));
  41. if (specialCount < config.PasswordSpecialcharsLength)
  42. {
  43. return Result.Failure(Error.Problem("Auth.PasswordSpecialChars", $"비밀번호에 특수문자가 {config.PasswordSpecialcharsLength}자 이상 포함되어야 합니다."));
  44. }
  45. }
  46. return Result.Success();
  47. }
  48. }