PTL_USER SafeDB 암호화 적용 / 포탈 사용자 마스킹 처리 해제

Update Hibernate configuration and enhance user management features

- Added Hibernate type tracing for improved debugging.
- Introduced new error messages for SafeDB operations in LocaleMessage properties.
- Updated portal user management to default to unmasked state.
- Refactored selectDetail method to handle masking option.
This commit is contained in:
Rinjae
2025-09-23 17:51:15 +09:00
parent ff856bbe28
commit d6fd6800ed
8 changed files with 2673 additions and 2656 deletions
@@ -93,6 +93,7 @@
<prop key="hibernate.hbm2ddl.auto">none</prop> <prop key="hibernate.hbm2ddl.auto">none</prop>
<prop key="hibernate.format_sql">true</prop> <prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.show_sql">true</prop> <prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.type">trace</prop>
<prop key="hibernate.dialect">${hibernate.dialect:org.hibernate.dialect.Oracle12cDialect} <prop key="hibernate.dialect">${hibernate.dialect:org.hibernate.dialect.Oracle12cDialect}
</prop> </prop>
<prop key="hibernate.jdbc.batch_size">100</prop> <prop key="hibernate.jdbc.batch_size">100</prop>
@@ -58,6 +58,8 @@
.setFormat(nameOptionFormat).rendering(); .setFormat(nameOptionFormat).rendering();
}); });
setSearchable('searchOrgId');
putSelectFromParam(); putSelectFromParam();
select_approvalStatus = ": ;" + getGridSelectText("CODE", "NAME", json.approvalStatusRows); select_approvalStatus = ": ;" + getGridSelectText("CODE", "NAME", json.approvalStatusRows);
select_userStatus = ": ;" + getGridSelectText("CODE", "NAME", json.userStatusRows); select_userStatus = ": ;" + getGridSelectText("CODE", "NAME", json.userStatusRows);
@@ -86,7 +88,7 @@
'<%= localeMessage.getString("portalUser.orgName") %>', '<%= localeMessage.getString("portalUser.orgName") %>',
'<%= localeMessage.getString("portalUser.name") %>', '<%= localeMessage.getString("portalUser.name") %>',
'<%= localeMessage.getString("portalUser.userId") %>', '<%= localeMessage.getString("portalUser.userId") %>',
'<%= localeMessage.getString("portalUser.mobile") %>', <%--'<%= localeMessage.getString("portalUser.mobile") %>',--%>
'<%= localeMessage.getString("portalUser.roleName") %>', '<%= localeMessage.getString("portalUser.roleName") %>',
'<%= localeMessage.getString("portalUser.userStatus") %>', '<%= localeMessage.getString("portalUser.userStatus") %>',
'<%= localeMessage.getString("portalUser.createOn") %>', '<%= localeMessage.getString("portalUser.createOn") %>',
@@ -98,7 +100,7 @@
{name: 'portalOrgUIs.orgName', align: 'center', width: "120"}, {name: 'portalOrgUIs.orgName', align: 'center', width: "120"},
{name: 'userName', align: 'center', width: "80" }, {name: 'userName', align: 'center', width: "80" },
{name: 'loginId', align: 'center', width: "150" }, {name: 'loginId', align: 'center', width: "150" },
{name: 'mobileNumber', align: 'center', width: "100" }, // {name: 'mobileNumber', align: 'center', width: "100" },
{name: 'roleCodeDescription', align: 'center', width: "80"}, {name: 'roleCodeDescription', align: 'center', width: "80"},
{name: 'userStatusDescription', align: 'center', width: "50"}, {name: 'userStatusDescription', align: 'center', width: "50"},
{name: 'createdDate', align: 'center', width: "100", formatter: timeStampFormat}, {name: 'createdDate', align: 'center', width: "100", formatter: timeStampFormat},
@@ -232,7 +234,9 @@
<th style="width:10%; min-width:100px;"><%= localeMessage.getString("portalUser.name") %> <th style="width:10%; min-width:100px;"><%= localeMessage.getString("portalUser.name") %>
</th> </th>
<td><input type="text" name="searchUserName"></td> <td><input type="text" name="searchUserName"></td>
<th style="width:10%; min-width:100px;"><%= localeMessage.getString("portalUser.userId") %>
<th style="width:10%; min-width:100px;">
<%= localeMessage.getString("portalUser.userId") %>
</th> </th>
<td><input type="text" name="searchUserId" value="${param.searchUserId}"></td> <td><input type="text" name="searchUserId" value="${param.searchUserId}"></td>
<th style="width:10%; min-width:100px;"><%= localeMessage.getString("portalUser.mobileNumber") %> <th style="width:10%; min-width:100px;"><%= localeMessage.getString("portalUser.mobileNumber") %>
@@ -183,6 +183,8 @@
$('#orgInfoSection').hide(); $('#orgInfoSection').hide();
} }
// 25.09.23 - 마스킹 해제 상태를 기본으로 적용 / Rinjae
updateButtonStates($("#userStatus").val(), true);
}, },
error: function (e) { error: function (e) {
alert(e.responseText); alert(e.responseText);
@@ -530,9 +532,11 @@
</div> </div>
<div class="content_middle"> <div class="content_middle">
<div class="search_wrap"> <div class="search_wrap">
<button type="button" class="cssbtn" id="btn_unmask" level="W" status="DETAIL"> <!-- 2025.09.23 - 마스킹 해제 상태를 기본으로 적용 / Rinjae -->
<%--<button type="button" class="cssbtn" id="btn_unmask" level="W" status="DETAIL">
<i class="material-icons">lock_open</i> 마스킹해제 <i class="material-icons">lock_open</i> 마스킹해제
</button> </button>--%>
<button type="button" class="cssbtn" id="btn_modify" level="W" status="DETAIL,NEW"> <button type="button" class="cssbtn" id="btn_modify" level="W" status="DETAIL,NEW">
<i class="material-icons">save</i> <%= localeMessage.getString("button.modify") %> <i class="material-icons">save</i> <%= localeMessage.getString("button.modify") %>
</button> </button>
@@ -11,6 +11,7 @@ public class PortalUserUISearch {
private String searchUserId; private String searchUserId;
private String searchUserName; private String searchUserName;
private String searchOrgId; private String searchOrgId;
private String searchOrgName;
private String searchEmailAddr; private String searchEmailAddr;
private String searchMobileNumber; private String searchMobileNumber;
private String searchRoleCode; private String searchRoleCode;
@@ -47,12 +47,13 @@ public class PortalUserManController extends BaseAnnotationController {
return ResponseEntity.ok(new GridResponse<>(page)); return ResponseEntity.ok(new GridResponse<>(page));
} }
// 2025.09.23 : 마스킹 해제를 기본상태로 변경 / Rinjae
/* 마스킹 처리된 값 /* 마스킹 처리된 값
* 수정버튼 비활성화. -> "마스킹해제" 버튼 클릭후 언마스크 * 수정버튼 비활성화. -> "마스킹해제" 버튼 클릭후 언마스크
* */ * */
@PostMapping(value = "/onl/apim/portaluser/portalUserMan.json", params = "cmd=DETAIL") @PostMapping(value = "/onl/apim/portaluser/portalUserMan.json", params = "cmd=DETAIL")
public ResponseEntity<PortalUserUI> selectDetail(String id) { public ResponseEntity<PortalUserUI> selectDetail(String id) {
PortalUserUI portalUserUI = portalUserManService.selectDetail(id); PortalUserUI portalUserUI = portalUserManService.selectDetail(id, false);
return ResponseEntity.ok(portalUserUI); return ResponseEntity.ok(portalUserUI);
} }
@@ -61,7 +62,7 @@ public class PortalUserManController extends BaseAnnotationController {
if (StringUtils.isBlank(reason)) { if (StringUtils.isBlank(reason)) {
throw new BizException("마스킹 해제 사유를 입력해 주세요."); throw new BizException("마스킹 해제 사유를 입력해 주세요.");
} }
PortalUserUI portalUserUI = portalUserManService.selectDetailUnmask(id); PortalUserUI portalUserUI = portalUserManService.selectDetail(id, false);
return ResponseEntity.ok(portalUserUI); return ResponseEntity.ok(portalUserUI);
} }
@@ -17,6 +17,7 @@ import com.eactive.eai.rms.onl.apim.masking.MaskingUtils;
import com.eactive.eai.rms.onl.apim.portalorg.PortalOrgManService; import com.eactive.eai.rms.onl.apim.portalorg.PortalOrgManService;
import com.eactive.eai.rms.onl.common.exception.BizException; import com.eactive.eai.rms.onl.common.exception.BizException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@@ -31,6 +32,7 @@ import java.util.List;
@Service @Service
@Transactional(transactionManager = "transactionManagerForEMS") @Transactional(transactionManager = "transactionManagerForEMS")
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j
public class PortalUserManService extends BaseService { public class PortalUserManService extends BaseService {
private final PortalUserService portalUserService; private final PortalUserService portalUserService;
@@ -45,7 +47,8 @@ public class PortalUserManService extends BaseService {
public Page<PortalUserUI> selectList(Pageable pageable, PortalUserUISearch portalUserUISearch) { public Page<PortalUserUI> selectList(Pageable pageable, PortalUserUISearch portalUserUISearch) {
Page<PortalUser> portalUser = portalUserService.findAll(pageable, portalUserUISearch); Page<PortalUser> portalUser = portalUserService.findAll(pageable, portalUserUISearch);
return portalUser.map(entity -> { return portalUser.map(entity -> {
PortalUserUI ui = convertToUIWithMaskOption(entity, true); PortalUserUI ui = convertToUIWithMaskOption(entity, false);
if (entity.getPortalOrg() != null) { if (entity.getPortalOrg() != null) {
setPortalOrgUI(entity, ui); setPortalOrgUI(entity, ui);
} }
@@ -53,9 +56,10 @@ public class PortalUserManService extends BaseService {
}); });
} }
public PortalUserUI selectDetail(String id) { public PortalUserUI selectDetail(String id, boolean isMasked) {
PortalUser portalUser = portalUserService.getById(id); PortalUser portalUser = portalUserService.getById(id);
PortalUserUI portalUserUI = convertToUIWithMaskOption(portalUser, true); PortalUserUI portalUserUI = convertToUIWithMaskOption(portalUser, isMasked);
if (portalUser.getPortalOrg() != null) { if (portalUser.getPortalOrg() != null) {
setPortalOrgUI(portalUser, portalUserUI); setPortalOrgUI(portalUser, portalUserUI);
} }
@@ -63,12 +67,7 @@ public class PortalUserManService extends BaseService {
} }
public PortalUserUI selectDetailUnmask(String id) { public PortalUserUI selectDetailUnmask(String id) {
PortalUser portalUser = portalUserService.getById(id); return selectDetail(id, false);
PortalUserUI portalUserUI = convertToUIWithMaskOption(portalUser, false);
if (portalUser.getPortalOrg() != null) {
setPortalOrgUI(portalUser, portalUserUI);
}
return portalUserUI;
} }
private void setPortalOrgUI(PortalUser portalUser, PortalUserUI portalUserUI) { private void setPortalOrgUI(PortalUser portalUser, PortalUserUI portalUserUI) {
@@ -2596,4 +2596,8 @@ auditLogMan.parameters = Parameters
auditLogMan.remoteAddress = Remote Address auditLogMan.remoteAddress = Remote Address
auditLogMan.systemCode = System Code auditLogMan.systemCode = System Code
auditLogMan.title = Search Audit Log auditLogMan.title = Search Audit Log
auditLogMan.userId = User ID auditLogMan.userId = User ID
safeDB.decryptError = SafeDB Decrypt Error
safeDB.encryptError = SafeDB Encrypt Error
File diff suppressed because it is too large Load Diff