diff --git a/src/main/java/com/eactive/apim/portal/invitation/event/UserInvitationEvent.java b/src/main/java/com/eactive/apim/portal/invitation/event/UserInvitationEvent.java index 40b864b..bcce2f9 100644 --- a/src/main/java/com/eactive/apim/portal/invitation/event/UserInvitationEvent.java +++ b/src/main/java/com/eactive/apim/portal/invitation/event/UserInvitationEvent.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Component; @Component public class UserInvitationEvent implements MessageEventHandler { - public static final String KEY = "user_invitation"; + public static final String KEY = "USER_INVITATION"; @Override public boolean allowAdditionalRecipients() { diff --git a/src/main/java/com/eactive/apim/portal/portaluser/entity/TwoFactorAuth.java b/src/main/java/com/eactive/apim/portal/portaluser/entity/TwoFactorAuth.java index 2d44033..98a5a24 100644 --- a/src/main/java/com/eactive/apim/portal/portaluser/entity/TwoFactorAuth.java +++ b/src/main/java/com/eactive/apim/portal/portaluser/entity/TwoFactorAuth.java @@ -2,10 +2,15 @@ package com.eactive.apim.portal.portaluser.entity; import com.eactive.eai.data.converter.LocalDateTimeToStringConverter14; import kjb.safedb.KjbNotRnnoJpaAttributeConverter; +import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.time.LocalDateTime; +/* +EMSADM.PK_PTL_TWO_FACTOR_AUTH / TS_EMS_I01 + */ + @Entity @Table(name = "PTL_TWO_FACTOR_AUTH") public class TwoFactorAuth { @@ -14,6 +19,11 @@ public class TwoFactorAuth { } @Id + @Column(name = "id", length = 36, nullable = false) + @GenericGenerator(name = "uuid-gen", strategy = "uuid2") + @GeneratedValue(generator = "uuid-gen", strategy = GenerationType.IDENTITY) + private String id; + @Column(name = "recipient", length = 255) @Convert(converter = KjbNotRnnoJpaAttributeConverter.class) private String recipient; @@ -54,4 +64,8 @@ public class TwoFactorAuth { public void setExpiresAt(LocalDateTime expiresAt) { this.expiresAt = expiresAt; } + + public String getId() { + return id; + } } diff --git a/src/main/java/com/eactive/apim/portal/portaluser/event/RequestAuthNumberEvent.java b/src/main/java/com/eactive/apim/portal/portaluser/event/UserVerificationEmailEvent.java similarity index 87% rename from src/main/java/com/eactive/apim/portal/portaluser/event/RequestAuthNumberEvent.java rename to src/main/java/com/eactive/apim/portal/portaluser/event/UserVerificationEmailEvent.java index 9017552..7167652 100644 --- a/src/main/java/com/eactive/apim/portal/portaluser/event/RequestAuthNumberEvent.java +++ b/src/main/java/com/eactive/apim/portal/portaluser/event/UserVerificationEmailEvent.java @@ -10,9 +10,9 @@ import java.util.HashMap; import java.util.Map; @Component -public class RequestAuthNumberEvent implements MessageEventHandler { +public class UserVerificationEmailEvent implements MessageEventHandler { - public static final String KEY = "request_auth_number"; + public static final String KEY = "USER_VERIFICATION_EMAIL"; @Override public boolean allowAdditionalRecipients() { @@ -33,7 +33,7 @@ public class RequestAuthNumberEvent implements MessageEventHandler { @Override public String getDisplayName() { - return "인증 번호 발송"; + return "이메일 인증번호 발송"; } @Override diff --git a/src/main/java/com/eactive/apim/portal/portaluser/event/UserVerificationMobilePhoneEvent.java b/src/main/java/com/eactive/apim/portal/portaluser/event/UserVerificationMobilePhoneEvent.java new file mode 100644 index 0000000..5f3550a --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/portaluser/event/UserVerificationMobilePhoneEvent.java @@ -0,0 +1,47 @@ +package com.eactive.apim.portal.portaluser.event; + + +import com.eactive.apim.portal.template.service.MessageEventHandler; +import com.eactive.apim.portal.template.service.MessageRecipient; +import com.eactive.apim.portal.template.service.MessageSendEvent; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class UserVerificationMobilePhoneEvent implements MessageEventHandler { + + public static final String KEY = "USER_VERIFICATION_MOBILEPHONE"; + + @Override + public boolean allowAdditionalRecipients() { + return false; + } + + @Override + public MessageSendEvent createEvent(Object source, MessageRecipient recipient, Map params) { + Map requestParams = new HashMap<>(); + requestParams.put("authNumber", (String) params.get("authNumber")); + return new MessageSendEvent(source, KEY, recipient, requestParams); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + public String getDisplayName() { + return "휴대폰 인증번호 발송"; + } + + @Override + public String getDescription() { + return "
사용 가능 변수:

" + + "
- userName 수신자 이름

" + + "
- userId 수신자 ID (이메일)

" + + "
- authNumber 인증번호

"; + + } +} diff --git a/src/main/java/com/eactive/apim/portal/portaluser/repository/PortalUserRepository.java b/src/main/java/com/eactive/apim/portal/portaluser/repository/PortalUserRepository.java index b9b7902..154868e 100644 --- a/src/main/java/com/eactive/apim/portal/portaluser/repository/PortalUserRepository.java +++ b/src/main/java/com/eactive/apim/portal/portaluser/repository/PortalUserRepository.java @@ -31,5 +31,7 @@ public interface PortalUserRepository extends BaseRepository Optional findByLoginIdAndMobileNumber(String loginId, String mobileNumber); long countByPortalOrg(PortalOrg portalOrg); + + Optional findByUserName(String userName); } diff --git a/src/main/java/com/eactive/apim/portal/portaluser/repository/TwoFactorAuthRepository.java b/src/main/java/com/eactive/apim/portal/portaluser/repository/TwoFactorAuthRepository.java index 1d06b22..b8219c9 100644 --- a/src/main/java/com/eactive/apim/portal/portaluser/repository/TwoFactorAuthRepository.java +++ b/src/main/java/com/eactive/apim/portal/portaluser/repository/TwoFactorAuthRepository.java @@ -3,5 +3,10 @@ package com.eactive.apim.portal.portaluser.repository; import com.eactive.apim.portal.portaluser.entity.TwoFactorAuth; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface TwoFactorAuthRepository extends JpaRepository { + Optional findByRecipient(String recipientKey); + + void deleteAllByRecipient(String recipient); } diff --git a/src/main/java/com/eactive/apim/portal/template/entity/MessageCode.java b/src/main/java/com/eactive/apim/portal/template/entity/MessageCode.java index 87204f3..2a8cec5 100644 --- a/src/main/java/com/eactive/apim/portal/template/entity/MessageCode.java +++ b/src/main/java/com/eactive/apim/portal/template/entity/MessageCode.java @@ -1,48 +1,80 @@ package com.eactive.apim.portal.template.entity; - -// com.eactive.apim.portal.template.entity.MessageRequestEnums.MessageCode 이미 중복이 있음 +import java.util.Optional; -//public enum MessageCode { -// -// API_APPROVED("API 승인 알림"), -// API_CANCELLED("API 취소 알림"), -// API_DENIED("API 거부 알림"), -// API_REGISTER("API 등록 알림"), -// -// APP_APPROVED("앱 승인 알림"), -// APP_REGISTER("앱 등록 완료"), -// APP_REGISTER_APPROVED("앱 승인 완료"), -//// APP_CANCELLED("앱 취소 알림"), -//// APP_DENIED("앱 거부 알림"), -//// APP_MODIFY("앱 수정 알림"), -// -// USER_MANAGER_ASSIGNED("관리자 권한 부여 알림"), -// USER_REGISTER_APPROVED("사용자 가입 승인 알림"), -// USER_REGISTER_DENIED("사용자 가입 거절 알림"), -// -//// USER_APPROVED, -//// USER_CANCELLED, -//// USER_DENIED, -//// USER_REGISTER, -// -// USER_INVITATION("이메일 초대"), -// REQUEST_AUTH_NUMBER("인증번호 요청"), -// -// USER_PASSWORD_RESET("비밀번호 초기화"), -// USER_PASSWORD_CHANGED("비밀번호 변경 완료 알림"); -//// USER_ACTIVATION("사용자 비활성화 알림"), -//// USER_CREATION("사용자 생성 알림"), -// -// private final String description; -// -// MessageCode(String description) { -// this.description = description; -// } -// -// public String getDescription() { -// return description; -// } -//} -// +public enum MessageCode { + // 사용자 이벤트 영역 + USER_VERIFICATION_EMAIL("이메일 주소 인증", "AG_NOTI001"), + USER_VERIFICATION_MOBILEPHONE("휴대폰 번호 인증", null), + + USER_PASSWORD_RESET("비밀번호 재설정", "AG_NOTI003"), + USER_PASSWORD_CHANGED("사용자 비밀번호 변경", "AG_NOTI004"), + + USER_ACCOUNT_LOCKED("계정 잠금 알림", "AG_NOTI005"), + + + // 법인관리자 이벤트 영역 + MANAGER_WITH_ORG_REGISTER_APPROVED("법인관리자 및 법인 등록 승인", "AG_NOTI008"), + MANAGER_WITH_ORG_REGISTER_REJECTED("법인관리자 및 법인 등록 거절", "AG_NOTI009"), + + USER_INVITATION("법인 이용자 이메일 초대", "AG_NOTI006"), + USER_INVICATION_CANCELED("법인 이용자 이메일 초대 취소", "AG_NOTI007"), + + + // 관리자 영역 + APP_REGISTER_APPROVED("앱 등록 승인", "AG_NOTI010"), + APP_REGISTER_REJECTED("앱 등록 거절", "AG_NOTI011"), + + + // 미 사용, 미 분류 + @Deprecated + API_APPROVED("API 승인 알림", null), + + @Deprecated + API_REJECTED("API 거절 알림", null), + + @Deprecated + APP_REGISTER("앱 등록 완료", null), + + @Deprecated + USER_MANAGER_ASSIGNED("관리자 권한 부여", null), + + @Deprecated + REQUEST_AUTH_NUMBER("인증번호 요청", null), + + @Deprecated + USER_WITHDRAWAL_APPROVED("계정 비활성화", null), + + @Deprecated + USER_ACTIVATION("사용자 활성화 완료", null), // 이게 왜...이메일 인증인건데........ + ; + + private final String description; + private final String serviceId; + + + public static Optional findServiceId(String code) { + for (MessageCode e : values()) { + if (e.name().equalsIgnoreCase(code)) { + return Optional.of(e); + } + } + return Optional.empty(); + } + + + MessageCode(String description, String serviceId) { + this.description = description; + this.serviceId = serviceId; + } + + + public String getDescription() { + return description; + } + + public String getServiceId() { + return serviceId; + } +} diff --git a/src/main/java/com/eactive/apim/portal/template/entity/MessageRequest.java b/src/main/java/com/eactive/apim/portal/template/entity/MessageRequest.java index 0266a7a..73578cc 100644 --- a/src/main/java/com/eactive/apim/portal/template/entity/MessageRequest.java +++ b/src/main/java/com/eactive/apim/portal/template/entity/MessageRequest.java @@ -2,11 +2,12 @@ package com.eactive.apim.portal.template.entity; import com.eactive.apim.portal.portaluser.entity.PortalUser; -import com.eactive.apim.portal.template.entity.MessageRequestEnums.MessageCode; import com.eactive.eai.data.converter.LocalDateTimeToStringConverter14; +import kjb.safedb.KjbNotRnnoJpaAttributeConverter; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.hibernate.annotations.Comment; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @@ -49,13 +50,19 @@ public class MessageRequest implements Serializable { private LocalDateTime sentDate; private String username; + + @Convert(converter = KjbNotRnnoJpaAttributeConverter.class) private String email; + + @Convert(converter = KjbNotRnnoJpaAttributeConverter.class) private String phone; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "user_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @Comment("발송 대상 사용자") private PortalUser user; + @Comment("UMS 연계용 UID") @Column(name="ums_uid", length = 16) private String umsUid; diff --git a/src/main/java/com/eactive/apim/portal/template/entity/MessageRequestEnums.java b/src/main/java/com/eactive/apim/portal/template/entity/MessageRequestEnums.java deleted file mode 100644 index e11b5bd..0000000 --- a/src/main/java/com/eactive/apim/portal/template/entity/MessageRequestEnums.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.eactive.apim.portal.template.entity; - -import java.util.Optional; - -public class MessageRequestEnums { - - public enum MessageCode { - // 사용자 이벤트 영역 - USER_VERIFICATION_EMAIL("이메일 주소 인증", "AG_NOTI001"), - USER_VERIFICATION_MOBILEPHONE("휴대폰 번호 인증", null), - - USER_PASSWORD_RESET("비밀번호 재설정", "AG_NOTI003"), - USER_PASSWORD_CHANGED("사용자 비밀번호 변경", "AG_NOTI004"), - - USER_ACCOUNT_LOCKED("계정 잠금 알림", "AG_NOTI005"), - - - // 법인관리자 이벤트 영역 - ORG_APPROVED("사용자 등록 승인", "AG_NOTI008"), - ORG_REJECTED("사용자 등록 거절", "AG_NOTI009"), - - USER_INVITATION("법인 이용자 이메일 초대", "AG_NOTI006"), - USER_INVICATION_CANCELED("법인 이용자 이메일 초대 취소", "AG_NOTI007"), - - - // 관리자 영역 - APP_REGISTER_APPROVED("앱 등록 승인", "AG_NOTI010"), - APP_REGISTER_REJECTED("앱 등록 거절", "AG_NOTI011"), - - - // 미 사용, 미 분류 - @Deprecated - API_APPROVED("API 승인 알림", null), - - @Deprecated - API_REJECTED("API 거절 알림", null), - - @Deprecated - APP_REGISTER("앱 등록 완료", null), - - @Deprecated - USER_MANAGER_ASSIGNED("관리자 권한 부여", null), - - @Deprecated - REQUEST_AUTH_NUMBER("인증번호 요청", null), - - @Deprecated - USER_WITHDRAWAL_APPROVED("계정 비활성화", null), - - @Deprecated - USER_ACTIVATION("사용자 활성화 완료", null), // 이게 왜...이메일 인증인건데........ - ; - - private final String description; - private final String serviceId; - - - public static Optional findServiceId(String code) { - for (MessageCode e : values()) { - if (e.name().equalsIgnoreCase(code)) { - return Optional.of(e); - } - } - return Optional.empty(); - } - - - MessageCode(String description, String serviceId) { - this.description = description; - this.serviceId = serviceId; - } - - - public String getDescription() { - return description; - } - - public String getServiceId() { - return serviceId; - } - } -} diff --git a/src/main/java/com/eactive/apim/portal/template/entity/MessageTemplateEnums.java b/src/main/java/com/eactive/apim/portal/template/entity/MessageTemplateEnums.java deleted file mode 100644 index bb9d49a..0000000 --- a/src/main/java/com/eactive/apim/portal/template/entity/MessageTemplateEnums.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.eactive.apim.portal.template.entity; - -@Deprecated -public class MessageTemplateEnums { - - // 이건 또 왜 3번쨰................... - -// public enum MessageCode { -// API_APPROVED("API 승인 알림"), -// APP_REGISTER("앱 등록 완료"), -// USER_ACTIVATION("사용자 활성화 완료"), -// USER_INVITATION("이메일 초대"), -// USER_PASSWORD_RESET("비밀번호 재설정"), -// USER_REGISTER_APPROVED("사용자 등록 승인"), -// USER_WITHDRAWAL_APPROVED("계정 비활성화"); -// -// private final String description; -// -// MessageCode(String description) { -// this.description = description; -// } -// -// public String getDescription() { -// return description; -// } -// } -} diff --git a/src/main/java/com/eactive/apim/portal/template/repository/MessageRequestRepository.java b/src/main/java/com/eactive/apim/portal/template/repository/MessageRequestRepository.java index fbea2e8..d9bf7a1 100644 --- a/src/main/java/com/eactive/apim/portal/template/repository/MessageRequestRepository.java +++ b/src/main/java/com/eactive/apim/portal/template/repository/MessageRequestRepository.java @@ -1,26 +1,29 @@ package com.eactive.apim.portal.template.repository; -import com.eactive.apim.portal.template.entity.MessageRequest; -import com.eactive.apim.portal.template.entity.MessageRequestEnums; -import com.eactive.eai.rms.data.EMSDataSource; +import java.util.List; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; +import com.eactive.apim.portal.template.entity.MessageCode; +import com.eactive.apim.portal.template.entity.MessageRequest; +import com.eactive.eai.rms.data.EMSDataSource; @Repository @EMSDataSource public interface MessageRequestRepository extends JpaRepository { @Query("SELECT m FROM MessageRequest m WHERE m.email = :email AND m.messageCode = :messageCode") - List findByEmailAndMessageCode(@Param("email") String email, @Param("messageCode") MessageRequestEnums.MessageCode messageCode); + List findByEmailAndMessageCode(@Param("email") String email, @Param("messageCode") MessageCode messageCode); // @Query("SELECT m fROM MessageRequest m WHERE m.email =:email AND m.messageCode =:messageCode ORDER BY m.requestDate DESC") - Optional findFirstByEmailAndMessageCodeOrderByRequestDateDesc(@Param("email") String email, @Param("messageCode") MessageRequestEnums.MessageCode messageCode); + Optional findFirstByEmailAndMessageCodeOrderByRequestDateDesc( + @Param("email") String email, @Param("messageCode") MessageCode messageCode + ); @Modifying(clearAutomatically = true) @Query("DELETE FROM MessageRequest m WHERE m.username =:username AND m.email =:email") diff --git a/src/main/java/com/eactive/apim/portal/template/service/MessageHandlerService.java b/src/main/java/com/eactive/apim/portal/template/service/MessageHandlerService.java index 3835ca2..4d8d49a 100644 --- a/src/main/java/com/eactive/apim/portal/template/service/MessageHandlerService.java +++ b/src/main/java/com/eactive/apim/portal/template/service/MessageHandlerService.java @@ -7,6 +7,8 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; +import com.eactive.apim.portal.template.entity.MessageCode; + import java.util.List; import java.util.Map; import java.util.function.Function; @@ -43,7 +45,8 @@ public class MessageHandlerService { @EventListener public void handleMessageSendEvent(MessageSendEvent event) { - messageSendService.sendMessage(event.getMessageType(), event.getRecipient(), event.getParams()); + // messageSendService.sendMessage(event.getMessageType(), event.getRecipient(), event.getParams()); + messageSendService.sendMessage(MessageCode.valueOf(event.getMessageType()), event.getRecipient(), event.getParams()); } } diff --git a/src/main/java/com/eactive/apim/portal/template/service/MessageSendService.java b/src/main/java/com/eactive/apim/portal/template/service/MessageSendService.java index dd5852c..c6ea3ff 100644 --- a/src/main/java/com/eactive/apim/portal/template/service/MessageSendService.java +++ b/src/main/java/com/eactive/apim/portal/template/service/MessageSendService.java @@ -1,8 +1,8 @@ package com.eactive.apim.portal.template.service; import com.eactive.apim.portal.portalproperty.service.PortalPropertyService; +import com.eactive.apim.portal.template.entity.MessageCode; import com.eactive.apim.portal.template.entity.MessageRequest; -import com.eactive.apim.portal.template.entity.MessageRequestEnums; import com.eactive.apim.portal.template.entity.MessageTemplate; import com.eactive.apim.portal.template.repository.MessageRequestRepository; import com.eactive.apim.portal.template.repository.MessageTemplateRepository; @@ -35,8 +35,8 @@ public class MessageSendService { private final PortalPropertyService portalPropertyService; @Transactional - public void sendMessage(String messageCode, MessageRecipient recipient, Map messageParams) { - processMessage(messageCode, recipient, messageParams); + public void sendMessage(MessageCode messageCode, MessageRecipient recipient, Map messageParams) { + processMessage(messageCode.name(), recipient, messageParams); } private void processMessage(String messageCode, MessageRecipient recipient, Map messageParams) { @@ -76,7 +76,7 @@ public class MessageSendService { if (template.getEnableSms().equalsIgnoreCase("Y")) { String smsEaiInterfaceId = portalProperties.get("message.integration.eaiId.sms"); MessageRequest smsRequest = new MessageRequest(); - smsRequest.setMessageCode(MessageRequestEnums.MessageCode.valueOf(template.getMessageCode().toUpperCase())); + smsRequest.setMessageCode(MessageCode.valueOf(template.getMessageCode().toUpperCase())); smsRequest.setSubject(subject); String smsMessage = buildMessage(template.getSmsTemplate(), messageParams); smsRequest.setMessage(smsMessage); @@ -93,7 +93,7 @@ public class MessageSendService { if (template.getEnableEmail().equalsIgnoreCase("Y")) { String mailEaiInterfaceId = portalProperties.get("message.integration.eaiId.email"); MessageRequest emailRequest = new MessageRequest(); - emailRequest.setMessageCode(MessageRequestEnums.MessageCode.valueOf(template.getMessageCode().toUpperCase())); + emailRequest.setMessageCode(MessageCode.valueOf(template.getMessageCode().toUpperCase())); emailRequest.setSubject(subject); String emailMessage = buildMessage(template.getEmailTemplate(), messageParams); emailRequest.setMessage(emailMessage); diff --git a/src/main/java/kjb/safedb/KjbNotRnnoJpaAttributeConverter.java b/src/main/java/kjb/safedb/KjbNotRnnoJpaAttributeConverter.java index 4fcb331..43f3772 100644 --- a/src/main/java/kjb/safedb/KjbNotRnnoJpaAttributeConverter.java +++ b/src/main/java/kjb/safedb/KjbNotRnnoJpaAttributeConverter.java @@ -29,9 +29,22 @@ public class KjbNotRnnoJpaAttributeConverter implements AttributeConverter {}", originalAttribute, attribute); + if (log.isDebugEnabled()) { + // originalAttribute 홀수 글자 마스킹 + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < originalAttribute.length(); i++) { + if (i % 2 == 0) { + sb.append(originalAttribute.charAt(i)); + } else { + sb.append("*"); + } + } + + originalAttribute = sb.toString(); + log.debug("DB 암호화 #2 : {} -> {}", originalAttribute, attribute); + } + } return attribute; }