{"record":{"id":"2c93066d8f3f4d63","repo":"dromara/Sa-Token","slug":"usernameandpassword-username-password","errorCode":null,"errorMessage":"UsernameAndPassword 格式错误，正确格式为：username:password","messagePattern":"UsernameAndPassword 格式错误，正确格式为：username:password","errorType":"validation","errorClass":"SaTokenException","httpStatus":null,"severity":"error","filePath":"sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicAccount.java","lineNumber":59,"sourceCode":"\t * @param username 账号\n\t * @param password 密码\n\t */\n\tpublic SaHttpBasicAccount(String username, String password) {\n\t\tthis.username = username;\n\t\tthis.password = password;\n\t}\n\n\t/**\n\t * 构造函数\n\t * @param usernameAndPassword 账号和密码，冒号隔开\n\t */\n\tpublic SaHttpBasicAccount(String usernameAndPassword) {\n\t\tif(SaFoxUtil.isEmpty(usernameAndPassword)) {\n\t\t\tthrow new SaTokenException(\"UsernameAndPassword 不能为空\");\n\t\t}\n\t\tString[] arr = usernameAndPassword.split(\":\");\n\t\tif(arr.length != 2) {\n\t\t\tthrow new SaTokenException(\"UsernameAndPassword 格式错误，正确格式为：username:password\");\n\t\t}\n\t\tthis.username = arr[0];\n\t\tthis.password = arr[1];\n\t}\n\n\t/**\n\t * 获取 账号\n\t *\n\t * @return username 账号\n\t */\n\tpublic String getUsername() {\n\t\treturn this.username;\n\t}\n\n\t/**\n\t * 设置 账号\n\t *\n\t * @param username 账号","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/dromara/Sa-Token/blob/ac2c7f6e94a78573cf0bcb932dd8b04e68fad189/sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicAccount.java#L41-L77","documentation":"The single-string SaHttpBasicAccount constructor splits its argument on ':' and requires exactly two parts. Zero colons (bare username), two or more colons (password containing ':' or stray separators), or a trailing-colon edge all make arr.length != 2 and throw this format exception.","triggerScenarios":"new SaHttpBasicAccount(\"admin\") — no colon; new SaHttpBasicAccount(\"admin:pa:ss\") — password containing a colon; config value built by concatenating fields where one side already contained a colon.","commonSituations":"Passwords with ':' characters stored in config; hand-assembled credential strings; secrets from vaults that include URI-style 'user:pass@host' pasted wholesale.","solutions":["Use the two-argument constructor when either part may contain ':': new SaHttpBasicAccount(username, password)","If passwords can contain ':', base64 or otherwise encode them before combining into the single-string form","Add a startup assertion that the configured string has exactly one unescaped colon"],"exampleFix":"// before\nnew SaHttpBasicAccount(\"admin\" + \":\" + \"pa:ss\"); // 3 parts -> throws\n\n// after\nnew SaHttpBasicAccount(\"admin\", \"pa:ss\"); // parts passed explicitly","handlingStrategy":"validation","validationCode":"long colons = usernameAndPassword.chars().filter(c -> c == ':').count();\nif (colons != 1) {\n    throw new IllegalArgumentException(\"need exactly one ':' in username:password\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use SaHttpBasicAccount(username, password) when either part may contain ':'","Encode passwords containing colons before packing them into one string","Add a config sanity check that rejects multi-colon credential values"],"tags":["sa-token","http-basic","authentication","parsing","validation"],"backgroundTag":null,"analyzedSha":"ac2c7f6e94a78573cf0bcb932dd8b04e68fad189","analyzedAt":"2026-08-14T14:36:10.271Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}