수정할때 비밀번호 틀리면 연결안되게

This commit is contained in:
leeheejin 2025-09-23 16:05:30 +09:00
parent d9270e6307
commit affb6899cc
4 changed files with 50 additions and 10 deletions

View File

@ -262,7 +262,9 @@ router.post(
}); });
} }
const result = await ExternalDbConnectionService.testConnectionById(id); // 테스트용 비밀번호가 제공된 경우 사용
const testData = req.body.password ? { password: req.body.password } : undefined;
const result = await ExternalDbConnectionService.testConnectionById(id, testData);
return res.status(200).json({ return res.status(200).json({
success: result.success, success: result.success,

View File

@ -239,13 +239,43 @@ export class ExternalDbConnectionService {
} }
} }
// 비밀번호가 변경되는 경우, 연결 테스트 먼저 수행
if (data.password && data.password !== "***ENCRYPTED***") {
// 임시 연결 설정으로 테스트
const testConfig = {
host: data.host || existingConnection.host,
port: data.port || existingConnection.port,
database: data.database_name || existingConnection.database_name,
user: data.username || existingConnection.username,
password: data.password, // 새로 입력된 비밀번호로 테스트
connectionTimeoutMillis: data.connection_timeout != null ? data.connection_timeout * 1000 : undefined,
queryTimeoutMillis: data.query_timeout != null ? data.query_timeout * 1000 : undefined,
ssl: (data.ssl_enabled || existingConnection.ssl_enabled) === "Y" ? { rejectUnauthorized: false } : false
};
// 연결 테스트 수행
const testResult = await DbConnectionManager.testConnection(
id,
existingConnection.db_type,
testConfig
);
if (!testResult.success) {
return {
success: false,
message: "새로운 연결 정보로 테스트에 실패했습니다. 수정할 수 없습니다.",
error: testResult.error ? `${testResult.error.code}: ${testResult.error.details}` : undefined
};
}
}
// 업데이트 데이터 준비 // 업데이트 데이터 준비
const updateData: any = { const updateData: any = {
...data, ...data,
updated_date: new Date(), updated_date: new Date(),
}; };
// 비밀번호가 변경된 경우 암호화 // 비밀번호가 변경된 경우 암호화 (연결 테스트 통과 후)
if (data.password && data.password !== "***ENCRYPTED***") { if (data.password && data.password !== "***ENCRYPTED***") {
updateData.password = PasswordEncryption.encrypt(data.password); updateData.password = PasswordEncryption.encrypt(data.password);
} else { } else {
@ -320,7 +350,8 @@ export class ExternalDbConnectionService {
* (ID ) * (ID )
*/ */
static async testConnectionById( static async testConnectionById(
id: number id: number,
testData?: { password?: string }
): Promise<import("../types/externalDbTypes").ConnectionTestResult> { ): Promise<import("../types/externalDbTypes").ConnectionTestResult> {
try { try {
// 저장된 연결 정보 조회 // 저장된 연결 정보 조회
@ -339,9 +370,15 @@ export class ExternalDbConnectionService {
}; };
} }
// 비밀번호 복호화 // 비밀번호 결정 (테스트용 비밀번호가 제공된 경우 그것을 사용, 아니면 저장된 비밀번호 복호화)
const decryptedPassword = await this.getDecryptedPassword(id); let password: string | null;
if (!decryptedPassword) { if (testData?.password) {
password = testData.password;
} else {
password = await this.getDecryptedPassword(id);
}
if (!password) {
return { return {
success: false, success: false,
message: "비밀번호 복호화에 실패했습니다.", message: "비밀번호 복호화에 실패했습니다.",
@ -358,7 +395,7 @@ export class ExternalDbConnectionService {
port: connection.port, port: connection.port,
database: connection.database_name, database: connection.database_name,
user: connection.username, user: connection.username,
password: decryptedPassword, password: password,
connectionTimeoutMillis: connection.connection_timeout != null ? connection.connection_timeout * 1000 : undefined, connectionTimeoutMillis: connection.connection_timeout != null ? connection.connection_timeout * 1000 : undefined,
queryTimeoutMillis: connection.query_timeout != null ? connection.query_timeout * 1000 : undefined, queryTimeoutMillis: connection.query_timeout != null ? connection.query_timeout * 1000 : undefined,
ssl: connection.ssl_enabled === "Y" ? { rejectUnauthorized: false } : false ssl: connection.ssl_enabled === "Y" ? { rejectUnauthorized: false } : false

View File

@ -221,7 +221,7 @@ export const ExternalDbConnectionModal: React.FC<ExternalDbConnectionModalProps>
return; return;
} }
const result = await ExternalDbConnectionAPI.testConnection(connection.id); const result = await ExternalDbConnectionAPI.testConnection(connection.id, formData.password);
setTestResult(result); setTestResult(result);
if (result.success) { if (result.success) {

View File

@ -205,10 +205,11 @@ export class ExternalDbConnectionAPI {
/** /**
* (ID ) * (ID )
*/ */
static async testConnection(connectionId: number): Promise<ConnectionTestResult> { static async testConnection(connectionId: number, password?: string): Promise<ConnectionTestResult> {
try { try {
const response = await apiClient.post<ApiResponse<ConnectionTestResult>>( const response = await apiClient.post<ApiResponse<ConnectionTestResult>>(
`${this.BASE_PATH}/${connectionId}/test` `${this.BASE_PATH}/${connectionId}/test`,
password ? { password } : undefined
); );
if (!response.data.success) { if (!response.data.success) {