From 05b9dc84dbc5886a015c1e94f2b8e6cfa9f4ed91 Mon Sep 17 00:00:00 2001 From: "semin.baek" Date: Mon, 4 Aug 2025 20:26:11 +0900 Subject: [PATCH] =?UTF-8?q?Spring=20Security,=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + src/database/create-database.sql | 55 +++++++++++++++---- src/database/create-initial-data.sql | 15 ++++- src/main/front/src/router/index.js | 14 ++--- src/main/front/src/views/MainView.vue | 34 ++++++++---- .../app/user/ConsoleUserMapper.java | 13 ----- .../{ConsoleUserDto.java => DfxUserDto.java} | 2 +- .../dfxconsole/app/user/DfxUserMapper.java | 13 +++++ .../framework/config/AppUserDetails.java | 20 +++---- .../config/AppUserDetailsService.java | 12 ++-- ...nUsernamePasswordAuthenticationFilter.java | 32 ++++++++++- .../config/PasswordGeneratorController.java | 32 +++++++++++ .../framework/config/SecurityConfig.java | 44 +++++++++++++-- .../framework/dto/SearchParameterDto.java | 25 +++++++++ src/main/resources/mapper/app/user.xml | 18 +++--- 15 files changed, 255 insertions(+), 75 deletions(-) delete mode 100644 src/main/java/com/bsmlab/dfx/dfxconsole/app/user/ConsoleUserMapper.java rename src/main/java/com/bsmlab/dfx/dfxconsole/app/user/{ConsoleUserDto.java => DfxUserDto.java} (93%) create mode 100644 src/main/java/com/bsmlab/dfx/dfxconsole/app/user/DfxUserMapper.java create mode 100644 src/main/java/com/bsmlab/dfx/dfxconsole/framework/config/PasswordGeneratorController.java create mode 100644 src/main/java/com/bsmlab/dfx/dfxconsole/framework/dto/SearchParameterDto.java diff --git a/build.gradle b/build.gradle index d8e06fa..4bd8192 100644 --- a/build.gradle +++ b/build.gradle @@ -37,6 +37,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.4' implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.17.0' runtimeOnly 'com.ibm.db2:jcc' runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc' runtimeOnly 'com.mysql:mysql-connector-j' diff --git a/src/database/create-database.sql b/src/database/create-database.sql index 59919af..118813b 100644 --- a/src/database/create-database.sql +++ b/src/database/create-database.sql @@ -1,19 +1,54 @@ CREATE SCHEMA DFXCONSOLE; -CREATE TABLE TB_CONSOLE_USER ( +CREATE TABLE TB_CODE ( + CODE_GROUP VARCHAR(64) NOT NULL + , CODE_NAME VARCHAR(64) NOT NULL + , CODE_VALUE VARCHAR(1024) NOT NULL + , CODE_DESCRIPTION VARCHAR(1024) + , ORDER_NO DECIMAL(5) NOT NULL + , PARENT_CODE_NAME VARCHAR(64) + , USE_YN VARCHAR(1) NOT NULL + , CONSTRAINT PK_CODE PRIMARY KEY (CODE_GROUP, CODE_NAME) +); + +CREATE TABLE TB_DFX_USER ( USER_UUID VARCHAR(64) NOT NULL , USER_EMAIL VARCHAR(320) NOT NULL , USER_PASSWORD VARCHAR(512) , USER_NICK VARCHAR(512) NOT NULL , USER_REGISTER_TIME VARCHAR(64) , LAST_LOGIN_TIME VARCHAR(64) - , CONSTRAINT PK_CONSOLE_USER PRIMARY KEY (USER_UUID) + , CONSTRAINT PK_DFX_USER PRIMARY KEY (USER_UUID) ); -COMMENT ON TABLE TB_CONSOLE_USER IS 'CMS 사용자'; -COMMENT ON COLUMN TB_CONSOLE_USER.USER_UUID IS '사용자 UUID - 자동생성됨'; -COMMENT ON COLUMN TB_CONSOLE_USER.USER_EMAIL IS '사용자 email - 로그인 아이디로 사용됨'; -COMMENT ON COLUMN TB_CONSOLE_USER.USER_PASSWORD IS '사용자 비밀번호'; -COMMENT ON COLUMN TB_CONSOLE_USER.USER_NICK IS '닉네임'; -COMMENT ON COLUMN TB_CONSOLE_USER.USER_REGISTER_TIME IS '가입일시'; -COMMENT ON COLUMN TB_CONSOLE_USER.LAST_LOGIN_TIME IS '마지막 로그인 일시'; -CREATE UNIQUE INDEX IX_CONSOLE_USER_01 ON TB_CONSOLE_USER(USER_EMAIL); +COMMENT ON TABLE TB_DFX_USER IS 'DFXCONSOLE 사용자'; +COMMENT ON COLUMN TB_DFX_USER.USER_UUID IS '사용자 UUID - 자동생성됨'; +COMMENT ON COLUMN TB_DFX_USER.USER_EMAIL IS '사용자 email - 로그인 아이디로 사용됨'; +COMMENT ON COLUMN TB_DFX_USER.USER_PASSWORD IS '사용자 비밀번호'; +COMMENT ON COLUMN TB_DFX_USER.USER_NICK IS '닉네임'; +COMMENT ON COLUMN TB_DFX_USER.USER_REGISTER_TIME IS '가입일시'; +COMMENT ON COLUMN TB_DFX_USER.LAST_LOGIN_TIME IS '마지막 로그인 일시'; +CREATE UNIQUE INDEX IX_DFX_USER_01 ON TB_DFX_USER(USER_EMAIL); + +CREATE TABLE TB_DFX_AGENT_CONFIG ( + AGENT_ID VARCHAR(256) NOT NULL + , HOST_NAME VARCHAR(256) + , LISTEN_PORT DECIMAL(5) NOT NULL + , DESCRIPTION VARCHAR(2048) + , POSTMAN_COUNT DECIMAL(9) + , DROPBOX_COUNT DECIMAL(9) + , STATUS_CODE VARCHAR(64) NOT NULL + , LAST_STATUS_TS TIMESTAMP NOT NULL + , SETTINGS_DATA CLOB + , CONSTRAINT PK_DFX_AGENT_CONFIG PRIMARY KEY (AGENT_ID) +); +COMMENT ON TABLE TB_DFX_AGENT_CONFIG IS '에이전트 설정'; +COMMENT ON COLUMN TB_DFX_AGENT_CONFIG.AGENT_ID IS '에이전트ID'; +COMMENT ON COLUMN TB_DFX_AGENT_CONFIG.HOST_NAME IS '에이전트가 설치된 HOSTNAME 또는 IP'; +COMMENT ON COLUMN TB_DFX_AGENT_CONFIG.LISTEN_PORT IS '에이전트 수신 포트'; +COMMENT ON COLUMN TB_DFX_AGENT_CONFIG.DESCRIPTION IS '에이전트 설명'; +COMMENT ON COLUMN TB_DFX_AGENT_CONFIG.POSTMAN_COUNT IS 'POSTMAN 갯수'; +COMMENT ON COLUMN TB_DFX_AGENT_CONFIG.DROPBOX_COUNT IS 'DROPBOX 갯수'; +COMMENT ON COLUMN TB_DFX_AGENT_CONFIG.STATUS_CODE IS '상태코드 CODE_GROUP: AGENT_STATUS_CODE'; +COMMENT ON COLUMN TB_DFX_AGENT_CONFIG.LAST_STATUS_TS IS '최종상태확인 시간'; +COMMENT ON COLUMN TB_DFX_AGENT_CONFIG.SETTINGS_DATA IS '에이전스 설정 파일 내용'; + diff --git a/src/database/create-initial-data.sql b/src/database/create-initial-data.sql index 360b2af..2b77d6f 100644 --- a/src/database/create-initial-data.sql +++ b/src/database/create-initial-data.sql @@ -1 +1,14 @@ -INSERT INTO TB_CONSOLE_USER (USER_UUID, USER_EMAIL, USER_PASSWORD, USER_NICK) VALUES ('dad9f3b6-45bf-49f9-85c5-1a83810d921c', 'smbaek@bsm-lab.com', 'qortpals1!', '백세민'); +INSERT INTO TB_CODE ( + CODE_GROUP, CODE_NAME, CODE_VALUE, CODE_DESCRIPTION, ORDER_NO, PARENT_CODE_NAME, USE_YN +) +VALUES ( + 'AGENT_STATUS_CODE', 'STATUS_OK', '정상', '정상', 1, NULL, 'Y' +); +INSERT INTO TB_CODE ( + CODE_GROUP, CODE_NAME, CODE_VALUE, CODE_DESCRIPTION, ORDER_NO, PARENT_CODE_NAME, USE_YN +) +VALUES ( + 'AGENT_STATUS_CODE', 'STATUS_UNKNOWN', '확인불가', '확인불가', 2, NULL, 'Y' +); + +INSERT INTO TB_DFX_USER (USER_UUID, USER_EMAIL, USER_PASSWORD, USER_NICK) VALUES ('dad9f3b6-45bf-49f9-85c5-1a83810d921c', 'smbaek@bsm-lab.com', 'qortpals1!', '백세민'); diff --git a/src/main/front/src/router/index.js b/src/main/front/src/router/index.js index 4f30514..07cc6cb 100644 --- a/src/main/front/src/router/index.js +++ b/src/main/front/src/router/index.js @@ -15,7 +15,7 @@ const router = createRouter({ meta: { isRequiredAuth: false }, }, { - path: '/about', + path: '/about.html', name: 'about', // route level code-splitting // this generates a separate chunk (About.[hash].js) for this route @@ -24,19 +24,19 @@ const router = createRouter({ meta: { isRequiredAuth: false }, }, { - path: '/login', + path: '/login.html', name: 'login', component: LoginView, meta: { isRequiredAuth: false }, }, { - path: '/main', + path: '/main.html', name: 'main', component: MainView, meta: { isRequiredAuth: true }, }, { - path: '/main-example', + path: '/main-example.html', name: 'main-example', component: MainViewExample, meta: { isRequiredAuth: false }, @@ -47,9 +47,9 @@ console.log('test') router.beforeEach((to, from, next) => { if (to.meta.isRequiredAuth && !userInfo.value.isLogin) { - next('/login') - } else if ((to.path === '/login' || to.path === '/') && userInfo.value.isLogin) { - next('/main') + next('/login.html') + } else if ((to.path === '/login.html' || to.path === '/') && userInfo.value.isLogin) { + next('/main.html') } else { next() } diff --git a/src/main/front/src/views/MainView.vue b/src/main/front/src/views/MainView.vue index 87078a2..7ee8188 100644 --- a/src/main/front/src/views/MainView.vue +++ b/src/main/front/src/views/MainView.vue @@ -1,16 +1,30 @@