{"record":{"id":"1462da0bc6c91831","repo":"dromara/Sa-Token","slug":"usernameandpassword","errorCode":null,"errorMessage":"UsernameAndPassword 不能为空","messagePattern":"UsernameAndPassword 不能为空","errorType":"validation","errorClass":"SaTokenException","httpStatus":null,"severity":"error","filePath":"sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicAccount.java","lineNumber":55,"sourceCode":"\tprivate String password;\n\n\t/**\n\t * 构造函数\n\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","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/dromara/Sa-Token/blob/ac2c7f6e94a78573cf0bcb932dd8b04e68fad189/sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicAccount.java#L37-L73","documentation":"SaHttpBasicAccount has a convenience constructor taking a single 'username:password' string. It rejects null/empty input immediately with this exception (no error code set). It guards developer configuration — Basic-auth credentials must be present before any 401 challenge logic can run.","triggerScenarios":"new SaHttpBasicAccount(\"\") or new SaHttpBasicAccount(null), typically because the credential string came from config or an environment variable that was never populated.","commonSituations":"sa-token.basic= left blank in application.yml but passed to the constructor; environment-specific env vars missing in a new deployment; refactoring that moved the constant and left an empty default.","solutions":["Supply a non-empty 'username:password' string, ideally from a validated config property","Fail fast at startup if the credential property is blank (add a @Validated @ConfigurationProperties check)","Prefer the two-argument constructor SaHttpBasicAccount(username, password) so emptiness is explicit at each call site"],"exampleFix":"// before\nString cred = env.getProperty(\"app.basic\", \"\");\nSaHttpBasicAccount acc = new SaHttpBasicAccount(cred); // throws when unset\n\n// after\nString cred = env.getRequiredProperty(\"app.basic\"); // fails fast if missing\nSaHttpBasicAccount acc = new SaHttpBasicAccount(cred);","handlingStrategy":"validation","validationCode":"if (SaFoxUtil.isEmpty(usernameAndPassword)) {\n    throw new IllegalArgumentException(\"basic credentials must be configured\");\n}\nnew SaHttpBasicAccount(usernameAndPassword);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate credential properties at startup (fail fast on blank)","Use the two-argument constructor to make both parts explicit","Externalize credentials via a vault/env with a required-property binding"],"tags":["sa-token","http-basic","authentication","configuration","validation"],"backgroundTag":null,"analyzedSha":"ac2c7f6e94a78573cf0bcb932dd8b04e68fad189","analyzedAt":"2026-08-14T14:36:10.271Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}