Browse Source

二次认证

于俊龙 1 month ago
parent
commit
63d2a279ce
20 changed files with 368 additions and 52 deletions
  1. 4 4
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/domain/entity/BssUserCertificationEntity.java
  2. 31 0
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/enums/BssUserCertificationFlag.java
  3. 31 0
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/enums/BssUserCertificationType.java
  4. 1 1
      farm-common/src/main/java/jp/yamoto/farm/common/enums/CrmPgIdEnum.java
  5. 1 1
      farm-common/src/main/java/jp/yamoto/farm/common/enums/SankinPgIdEnum.java
  6. 9 1
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/mapper/BssUserCertificationBaseMapper.java
  7. 8 1
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/service/IBssUserCertificationBaseService.java
  8. 25 11
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/service/impl/BssUserCertificationBaseServiceImpl.java
  9. 30 1
      farm-common-biz/src/main/resources/mapper/BssUserCertificationBaseMapper.xml
  10. 6 4
      farm-common/src/main/java/jp/yamoto/farm/common/core/domain/AjaxResult.java
  11. 3 1
      farm-common/src/main/java/jp/yamoto/farm/common/core/enums/DelFlgEnum.java
  12. 7 6
      farm-common/src/main/java/jp/yamoto/farm/common/utils/DateUtils.java
  13. 1 1
      farm-crm-biz/src/main/resources/mapper/crm/SysUserMapper.xml
  14. 6 0
      farm-crm/src/main/resources/application.yml
  15. 42 19
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/auth/service/AuthService.java
  16. 38 0
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/domain/bo/BssUserAuthCodeMailBo.java
  17. 20 0
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/service/IBssUserCertificationService.java
  18. 98 0
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/service/impl/BssUserCertificationServiceImpl.java
  19. 6 0
      farm-sankin/src/main/resources/application.yml
  20. 1 1
      farm-sankin/src/main/resources/i18n/messages.properties

+ 4 - 4
farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/domain/entity/BssUserCertificationEntity.java

@@ -24,17 +24,17 @@ public class BssUserCertificationEntity extends BaseEntity {
     private String id;
 
     /**
-     * 認証方法
+     * 認証方法 0:SMS 1:メール
      */
     private String certificationFlg;
 
     /**
-     * メールアドレス
+     * メールアドレス 認証方法= 1 の場合、空にすることはできません。
      */
     private String mailAddress;
 
     /**
-     * 電話番号
+     * 電話番号 認証方法= 0 の場合、空にすることはできません。
      */
     private String phoneNumber;
 
@@ -44,7 +44,7 @@ public class BssUserCertificationEntity extends BaseEntity {
     private String farmerId;
 
     /**
-     * 種類
+     * 種類 0:CRM 1:農家
      */
     private String type;
 

+ 31 - 0
farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/enums/BssUserCertificationFlag.java

@@ -0,0 +1,31 @@
+package jp.yamoto.farm.common.biz.enums;
+
+/**
+ * ユーザー認証情報 - 認証方法
+ * 0:SMS 1:メール
+ */
+public enum BssUserCertificationFlag {
+
+    SMS("0", "SMS"),
+
+    MAIL("1", "メール");
+
+    private final String code;
+    private final String info;
+
+    BssUserCertificationFlag(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 31 - 0
farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/enums/BssUserCertificationType.java

@@ -0,0 +1,31 @@
+package jp.yamoto.farm.common.biz.enums;
+
+/**
+ * ユーザー認証情報 - 種類
+ * 0:CRM 1:農家
+ */
+public enum BssUserCertificationType {
+
+    CRM("0", "CRM"),
+
+    FRAMER("1", "農家");
+
+    private final String code;
+    private final String info;
+
+    BssUserCertificationType(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 1 - 1
farm-common/src/main/java/jp/yamoto/farm/common/enums/CrmPgIdEnum.java

@@ -1,4 +1,4 @@
-package jp.yamoto.farm.common.enums;
+package jp.yamoto.farm.common.biz.enums;
 
 /**
  * CRM プログラムID

+ 1 - 1
farm-common/src/main/java/jp/yamoto/farm/common/enums/SankinPgIdEnum.java

@@ -1,4 +1,4 @@
-package jp.yamoto.farm.common.enums;
+package jp.yamoto.farm.common.biz.enums;
 
 /**
  * 農家 プログラムID

+ 9 - 1
farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/mapper/BssUserCertificationBaseMapper.java

@@ -1,8 +1,8 @@
 package jp.yamoto.farm.common.biz.mapper;
 
 import jp.yamoto.farm.common.biz.domain.entity.BssUserCertificationEntity;
+
 import java.util.List;
-import lombok.EqualsAndHashCode;
 
 
 /**
@@ -52,4 +52,12 @@ public interface BssUserCertificationBaseMapper {
      */
     public int deleteById(String id);
 
+    /**
+     * 廃止
+     *
+     * @param bssUserCertification
+     * @return
+     */
+    int deleteLogicByIdAndVersion(BssUserCertificationEntity bssUserCertification);
+
 }

+ 8 - 1
farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/service/IBssUserCertificationBaseService.java

@@ -1,8 +1,8 @@
 package jp.yamoto.farm.common.biz.service;
 
 import jp.yamoto.farm.common.biz.domain.entity.BssUserCertificationEntity;
+
 import java.util.List;
-import lombok.EqualsAndHashCode;
 
 
 /**
@@ -52,4 +52,11 @@ public interface IBssUserCertificationBaseService {
      */
     public int deleteById(String id);
 
+    /**
+     * 廃止
+     *
+     * @param bssUserCertification
+     * @return
+     */
+    int deleteLogicByIdAndVersion(BssUserCertificationEntity bssUserCertification);
 }

+ 25 - 11
farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/service/impl/BssUserCertificationBaseServiceImpl.java

@@ -5,12 +5,11 @@ import jp.yamoto.farm.common.biz.mapper.BssUserCertificationBaseMapper;
 import jp.yamoto.farm.common.biz.service.IBssUserCertificationBaseService;
 import jp.yamoto.farm.common.exception.ServiceException;
 import jp.yamoto.farm.common.utils.MessageUtils;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import java.util.List;
 
+import java.util.List;
 
 /**
  * ユーザー認証情報Serviceインタフェース
@@ -24,8 +23,8 @@ public class BssUserCertificationBaseServiceImpl implements IBssUserCertificatio
     @Autowired 
     private BssUserCertificationBaseMapper bssUserCertificationBaseMapper;
 
-     /**
-     *ユーザー認証情報を検索
+    /**
+     * ユーザー認証情報を検索
      *
      * @param id ユーザー認証情報プライマリ・キー
      * @return ユーザー認証情報
@@ -36,13 +35,13 @@ public class BssUserCertificationBaseServiceImpl implements IBssUserCertificatio
         BssUserCertificationEntity  bssUserCertificationEntity  = bssUserCertificationBaseMapper.selectById(id) ;
 
         if (bssUserCertificationEntity  == null) {
-            throw new ServiceException(MessageUtils.message("E0007"));
+            throw new ServiceException(MessageUtils.message("E0016", id));
         }
         return bssUserCertificationEntity ;
     }
 
 
-     /**
+    /**
      * ユーザー認証情報を検索リスト
      *
      * @param bssUserCertification ユーザー認証情報パラメータ対象
@@ -55,7 +54,7 @@ public class BssUserCertificationBaseServiceImpl implements IBssUserCertificatio
     }
 
 
-     /**
+    /**
      * ユーザー認証情報を登録
      *
      * @param bssUserCertification ユーザー認証情報
@@ -69,8 +68,8 @@ public class BssUserCertificationBaseServiceImpl implements IBssUserCertificatio
     }
 
 
-     /**
-     *ユーザー認証情報を修正
+    /**
+     * ユーザー認証情報を修正
      *
      * @param bssUserCertification ユーザー認証情報
      * @return  結果
@@ -85,8 +84,9 @@ public class BssUserCertificationBaseServiceImpl implements IBssUserCertificatio
         }
         return result;
     }
-     /**
-     *ユーザー認証情報を削除
+
+    /**
+     * ユーザー認証情報を削除
      *
      * @param id ユーザー認証情報プライマリ・キー
      * @return  結果
@@ -101,5 +101,19 @@ public class BssUserCertificationBaseServiceImpl implements IBssUserCertificatio
         return result;
     }
 
+    /**
+     * 廃止
+     *
+     * @param bssUserCertification
+     * @return
+     */
+    @Override
+    public int deleteLogicByIdAndVersion(BssUserCertificationEntity bssUserCertification){
+        int result = bssUserCertificationBaseMapper.deleteLogicByIdAndVersion(bssUserCertification);
+        if (result < 1) {
+            throw new ServiceException(MessageUtils.message("E0007"));
+        }
+        return result;
+    }
 
 }

+ 30 - 1
farm-common-biz/src/main/resources/mapper/BssUserCertificationBaseMapper.xml

@@ -3,6 +3,7 @@
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="jp.yamoto.farm.common.biz.mapper.BssUserCertificationBaseMapper">
+
    <resultMap type="BssUserCertificationEntity" id="BssUserCertificationEntityResult">
         <result property="id" column="id"/>
         <result property="certificationFlg" column="certification_flg"/>
@@ -21,8 +22,8 @@
         <result property="updateBy" column="update_by"/>
         <result property="updatePgId" column="update_pg_id"/>
         <result property="version" column="version"/>
-
     </resultMap>
+
     <sql id="selectBssUserCertification">
         select
           id,
@@ -37,6 +38,7 @@
           discontinued_flg
         from bss_user_certification
     </sql>
+
     <select id="selectList" parameterType="BssUserCertificationEntity" resultMap="BssUserCertificationEntityResult">
         <include refid="selectBssUserCertification"/>
         <where>
@@ -263,4 +265,31 @@
 
     </delete>
 
+    <!--廃止-->
+    <update id="deleteLogicByIdAndVersion" parameterType="BssUserCertificationEntity">
+        update
+        bss_user_certification
+        set
+        discontinued_flg = 1,
+        version = version + 1,
+
+        <if test="updateBy != null">
+            update_by = #{updateBy},
+        </if>
+        <if test="updateTime != null">
+            update_time = #{updateTime}
+        </if>
+        <if test="updatePgId != null">
+            update_pg_id = #{updatePgId},
+        </if>
+
+        <where>
+            <if test="id != null  and id != ''">
+                and id = #{id}
+            </if>
+            and version = #{version}
+            and discontinued_flg = 0
+        </where>
+    </update>
+
  </mapper>

+ 6 - 4
farm-common/src/main/java/jp/yamoto/farm/common/core/domain/AjaxResult.java

@@ -1,10 +1,12 @@
 package jp.yamoto.farm.common.core.domain;
 
-import java.util.HashMap;
-import java.util.Objects;
 import jp.yamoto.farm.common.constant.HttpStatus;
+import jp.yamoto.farm.common.utils.MessageUtils;
 import jp.yamoto.farm.common.utils.StringUtils;
 
+import java.util.HashMap;
+import java.util.Objects;
+
 /**
  * 操作メッセージリマインダー
  *
@@ -26,7 +28,7 @@ public class AjaxResult extends HashMap<String, Object> {
     /**
      * 成功のメッセージ内容
      */
-    public static final String SUCCESS_MSG = "OK";
+    public static final String SUCCESS_MSG = "I0001";
     /**
      * 失敗のメッセージ内容
      */
@@ -81,7 +83,7 @@ public class AjaxResult extends HashMap<String, Object> {
      * @return 成功メッセージ
      */
     public static AjaxResult success(Object data) {
-        return AjaxResult.success(SUCCESS_MSG, data);
+        return AjaxResult.success(MessageUtils.message(SUCCESS_MSG), data);
     }
 
     /**

+ 3 - 1
farm-common/src/main/java/jp/yamoto/farm/common/core/enums/DelFlgEnum.java

@@ -3,7 +3,9 @@ package jp.yamoto.farm.common.core.enums;
 import lombok.Getter;
 
 /**
- * 削除フラグのコード定数
+ * 削除フラグ/廃止フラグ のコード定数
+ * 1:廃止 0:有効
+ * 1:削除する 0:未削除
  *
  * @author nextosd
  */

+ 7 - 6
farm-common/src/main/java/jp/yamoto/farm/common/utils/DateUtils.java

@@ -1,15 +1,12 @@
 package jp.yamoto.farm.common.utils;
 
+import org.apache.commons.lang3.time.DateFormatUtils;
+
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
+import java.time.*;
 import java.util.Date;
-import org.apache.commons.lang3.time.DateFormatUtils;
 
 /**
  * 時間ツールクラス
@@ -58,6 +55,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
     }
 
+    public static final String getTime(Long timeMillis){
+        return DateUtils.parseDateToStr(YYYY_MM_DD_HH_MM_SS, new Date(timeMillis)) ;
+    }
+
     public static final String dateTimeNow()
     {
         return dateTimeNow(YYYYMMDDHHMMSS);

+ 1 - 1
farm-crm-biz/src/main/resources/mapper/crm/SysUserMapper.xml

@@ -64,7 +64,7 @@
 		<if test="nickName != null and nickName != ''">
 			AND u.nick_name like concat('%', #{nickName}, '%')
 		</if>
-		<if test="statusList != null and statusList != ''">
+		<if test="statusList != null">
 			AND u.status IN
 			<foreach collection="statusList" item="status" open="(" separator="," close=")">
 				#{status}

+ 6 - 0
farm-crm/src/main/resources/application.yml

@@ -21,6 +21,12 @@ farm:
   # ホワイトURLリスト
   whiteUrlList:
     - /crm/organization/**
+  # 認証コード
+  authCode:
+    # 認証コード 長
+    length: 6
+    # 有効期間(デフォルト10分)
+    expireMinutes: 10
 
 # 開発環境の構成
 server:

+ 42 - 19
farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/auth/service/AuthService.java

@@ -1,26 +1,25 @@
 package jp.yamoto.farm.sankin.biz.auth.service;
 
 import jakarta.annotation.Resource;
+import jp.yamoto.farm.common.biz.enums.BssUserCertificationType;
+import jp.yamoto.farm.common.biz.enums.SankinPgIdEnum;
 import jp.yamoto.farm.common.config.AppConfig;
 import jp.yamoto.farm.common.constant.Constants;
-import jp.yamoto.farm.common.constant.UserConstants;
 import jp.yamoto.farm.common.core.domain.entity.FarmerUserInfo;
-import jp.yamoto.farm.common.core.domain.entity.SysUser;
 import jp.yamoto.farm.common.core.domain.model.LoginUser;
 import jp.yamoto.farm.common.core.service.TokenService;
-import jp.yamoto.farm.common.enums.AuthStatusEnum;
 import jp.yamoto.farm.common.enums.UserStatus;
 import jp.yamoto.farm.common.exception.ServiceException;
 import jp.yamoto.farm.common.exception.user.AuthVerifyCodeNotMatchException;
-import jp.yamoto.farm.common.exception.user.UserNotExistsException;
 import jp.yamoto.farm.common.exception.user.UserPasswordNotMatchException;
 import jp.yamoto.farm.common.manager.AsyncManager;
 import jp.yamoto.farm.common.manager.factory.AsyncFactory;
 import jp.yamoto.farm.common.security.context.AuthenticationContextHolder;
 import jp.yamoto.farm.common.utils.*;
-import jp.yamoto.farm.common.utils.ip.IpUtils;
 import jp.yamoto.farm.sankin.biz.auth.domain.*;
+import jp.yamoto.farm.sankin.biz.domain.bo.BssUserAuthCodeMailBo;
 import jp.yamoto.farm.sankin.biz.mapper.FarmerUserMapper;
+import jp.yamoto.farm.sankin.biz.service.IBssUserCertificationService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,13 +27,9 @@ import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
 import java.util.Map;
 
 /**
@@ -58,6 +53,9 @@ public class AuthService {
     @Autowired
     private FarmerUserMapper farmerMapper;
 
+    @Autowired
+    private IBssUserCertificationService bssUserCertificationService;
+
     /**
      * ログイン検証
      * 
@@ -76,7 +74,13 @@ public class AuthService {
         }
 
         // 認証コードを送信する
-        String sendId = "123";
+        BssUserAuthCodeMailBo bssUserAuthCodeMailBo = new BssUserAuthCodeMailBo();
+        bssUserAuthCodeMailBo.setUserId(userDetails.getFarmerId());
+        bssUserAuthCodeMailBo.setMailAddress(userDetails.getMailAddress());
+        bssUserAuthCodeMailBo.setType(BssUserCertificationType.FRAMER);
+        bssUserAuthCodeMailBo.setPgId(SankinPgIdEnum.N001.getCode());
+
+        String sendId = bssUserCertificationService.sendAuthCodeByEmail(bssUserAuthCodeMailBo);
 
         return this.createTempToken(sendId, userDetails.getMailAddress());
     }
@@ -86,6 +90,7 @@ public class AuthService {
      * @param authSecondBo
      * @return
      */
+    @Transactional
     public String authenticateSecond(AuthSecondVerifyBo authSecondBo){
 
         // ユーザー認証
@@ -132,6 +137,7 @@ public class AuthService {
     /**
      * 認証コードを再送信する
      */
+    @Transactional
     public String resendAuthCode(AuthReSendVerifyCodeBo authReSendVerifyCodeBo) throws Exception {
 
         AuthTempTokenBo authTempTokenBo = getTempToken(authReSendVerifyCodeBo.getTempToken());
@@ -139,9 +145,15 @@ public class AuthService {
         // ユーザー
         FarmerUserInfo userDetails = this.selectUserByMailAddress(authTempTokenBo.getMailAddess());
 
-        // TODO 認証コードを再送信する
-       // emailService.generateAndSendVerificationCode(user.getEmail());
-        String sendId = "5698";
+        // 認証コードを再送信する
+        BssUserAuthCodeMailBo bssUserAuthCodeMailBo = new BssUserAuthCodeMailBo();
+        bssUserAuthCodeMailBo.setUserId(userDetails.getFarmerId());
+        bssUserAuthCodeMailBo.setMailAddress(userDetails.getMailAddress());
+        bssUserAuthCodeMailBo.setType(BssUserCertificationType.FRAMER);
+        bssUserAuthCodeMailBo.setPgId(SankinPgIdEnum.N003.getCode());
+        bssUserAuthCodeMailBo.setPreSendId(authTempTokenBo.getSendVerifyCodeId());
+
+        String sendId = bssUserCertificationService.sendAuthCodeByEmail(bssUserAuthCodeMailBo);
 
         return this.createTempToken(sendId, userDetails.getMailAddress());
     }
@@ -150,6 +162,7 @@ public class AuthService {
      * パスワード再設定
      * @param authResetPwdBo
      */
+    @Transactional
     public void resetPwd(AuthResetPwdBo authResetPwdBo){
         LoginUser loginUser = SecurityUtils.getLoginUser();
 
@@ -168,10 +181,13 @@ public class AuthService {
 
     /**
      * 認証コードを送信します。
+     * パスワードを忘れた方
+     *
      * @param authSendVerifyCodeBo
      *
      * @return 一時token
      */
+    @Transactional
     public String sendAuthCode(AuthSendVerifyCodeBo authSendVerifyCodeBo){
         // メールアドレス 必須入力
         if(ValueUtils.isEmpty(authSendVerifyCodeBo.getMailAddress())){
@@ -187,9 +203,16 @@ public class AuthService {
             throw new ServiceException(MessageUtils.message("E0062", authSendVerifyCodeBo.getMailAddress()));
         }
 
-        // TODO 認証コードを送信
+        // 認証コードを送信する
+        BssUserAuthCodeMailBo bssUserAuthCodeMailBo = new BssUserAuthCodeMailBo();
+        bssUserAuthCodeMailBo.setUserId(user.getFarmerId());
+        bssUserAuthCodeMailBo.setMailAddress(user.getMailAddress());
+        bssUserAuthCodeMailBo.setType(BssUserCertificationType.FRAMER);
+        bssUserAuthCodeMailBo.setPgId(SankinPgIdEnum.N002.getCode());
+
+        String sendId = bssUserCertificationService.sendAuthCodeByEmail(bssUserAuthCodeMailBo);
 
-        return null;
+        return this.createTempToken(sendId, user.getMailAddress());
     }
 
     public FarmerUserInfo selectUserByUserName(String username){
@@ -241,7 +264,7 @@ public class AuthService {
     /**
      * 認証トークンの生成
      *
-     * @param sendAuthVerifyCodeId セッション管理ID
+     * @param sendAuthVerifyCodeId ユーザー認証情報ID
      * @param email              メールアドレス
      * @return 認証トークン
      */
@@ -250,7 +273,7 @@ public class AuthService {
         try {
             Map<String, Object> encryptMap = Map.of(
                     "sendId", sendAuthVerifyCodeId,
-                    "email", email);
+                    "sendAddress", email);
             String tokenFormat = JsonUtil.toJsonStr(encryptMap);
             resultToken = DecryptUtils.decryptAES(tokenFormat);
         } catch (Exception ex) {
@@ -284,7 +307,7 @@ public class AuthService {
 
         if (null != tokenMap && tokenMap.containsKey("sendId") && StringUtils.isNotNull(tokenMap.get("sendId"))) {
             result.setSendVerifyCodeId(String.valueOf(tokenMap.get("sendId")));
-            result.setMailAddess(String.valueOf(tokenMap.get("email")));
+            result.setMailAddess(String.valueOf(tokenMap.get("sendAddress")));
         }
 
         return result;

+ 38 - 0
farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/domain/bo/BssUserAuthCodeMailBo.java

@@ -0,0 +1,38 @@
+package jp.yamoto.farm.sankin.biz.domain.bo;
+
+import jp.yamoto.farm.common.biz.enums.BssUserCertificationType;
+import lombok.Data;
+
+/**
+ * 認証コード - EMail送信
+ *
+ * @author nextosd
+ */
+@Data
+public class BssUserAuthCodeMailBo {
+
+    /**
+     * ユーザーID
+     */
+    private String userId;
+
+    /**
+     * メールアドレス
+     */
+    private String mailAddress;
+
+    /**
+     * 種類
+     */
+    private BssUserCertificationType type;
+
+    /**
+     * プログラムID
+     */
+    private String pgId;
+
+    /**
+     * 前回送信ID
+     */
+    private String preSendId;
+}

+ 20 - 0
farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/service/IBssUserCertificationService.java

@@ -0,0 +1,20 @@
+package jp.yamoto.farm.sankin.biz.service;
+
+import jp.yamoto.farm.common.biz.service.IBssUserCertificationBaseService;
+import jp.yamoto.farm.sankin.biz.domain.bo.BssUserAuthCodeMailBo;
+
+/**
+ * ユーザー認証情報Serviceインタフェース
+ *
+ * @author nextosd
+ */
+public interface IBssUserCertificationService extends IBssUserCertificationBaseService {
+
+    /**
+     * 認証コード - EMail送信する
+     *
+     * @param params 送信
+     * @return ID
+     */
+    String sendAuthCodeByEmail(BssUserAuthCodeMailBo params);
+}

+ 98 - 0
farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/service/impl/BssUserCertificationServiceImpl.java

@@ -0,0 +1,98 @@
+package jp.yamoto.farm.sankin.biz.service.impl;
+
+import jp.yamoto.farm.common.biz.domain.entity.BssUserCertificationEntity;
+import jp.yamoto.farm.common.biz.enums.BssUserCertificationFlag;
+import jp.yamoto.farm.common.biz.service.impl.BssUserCertificationBaseServiceImpl;
+import jp.yamoto.farm.common.core.enums.DelFlgEnum;
+import jp.yamoto.farm.common.exception.ServiceException;
+import jp.yamoto.farm.common.utils.DateUtils;
+import jp.yamoto.farm.common.utils.MessageUtils;
+import jp.yamoto.farm.common.utils.ValueUtils;
+import jp.yamoto.farm.common.utils.uuid.IdUtils;
+import jp.yamoto.farm.sankin.biz.domain.bo.BssUserAuthCodeMailBo;
+import jp.yamoto.farm.sankin.biz.service.IBssUserCertificationService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.Random;
+
+/**
+ * ユーザー認証情報Serviceインタフェース
+ *
+ * @author nextosd
+ */
+@Service
+public class BssUserCertificationServiceImpl extends BssUserCertificationBaseServiceImpl implements IBssUserCertificationService {
+
+    // Length
+    @Value("${farm.authCode.length:6}")
+    private int codeLength;
+
+    // 有効期間
+    @Value("${farm.authCode.expireMinutes:5}")
+    private int expireMinutes;
+
+    /**
+     * 認証コード - EMail送信する
+     *
+     * @param params 送信
+     * @return ID
+     */
+    @Override
+    public String sendAuthCodeByEmail(BssUserAuthCodeMailBo params) {
+
+        // ユーザーID E0003={0}は必須入力です。
+        if(ValueUtils.isEmpty(params.getUserId())){
+            throw new ServiceException(MessageUtils.message("E0003", MessageUtils.message("label.userName")));
+        }
+
+        // メールアドレス E0003={0}は必須入力です。
+        if(ValueUtils.isEmpty(params.getMailAddress())){
+            throw new ServiceException(MessageUtils.message("E0003", MessageUtils.message("label.mailAddress")));
+        }
+
+        // 前回送信したIDが存在する場合は廃止する
+        if(ValueUtils.isNotEmpty(params.getPreSendId())){
+            BssUserCertificationEntity bssUserCertificationEntityDelete = this.selectById(params.getPreSendId());
+            bssUserCertificationEntityDelete.setUpdatePgId(params.getPgId());
+            this.deleteLogicByIdAndVersion(bssUserCertificationEntityDelete);
+        }
+
+        BssUserCertificationEntity bssUserCertificationEntity = new BssUserCertificationEntity();
+        bssUserCertificationEntity.setId(IdUtils.nextIdStr());
+        bssUserCertificationEntity.setType(params.getType().getCode());
+        bssUserCertificationEntity.setCertificationFlg(BssUserCertificationFlag.MAIL.getCode());
+        bssUserCertificationEntity.setMailAddress(params.getMailAddress());
+        bssUserCertificationEntity.setFarmerId(params.getUserId());
+        bssUserCertificationEntity.setCreatePgId(params.getPgId());
+        bssUserCertificationEntity.setVersion(1);
+        bssUserCertificationEntity.setCertificationCode(this.generateCode());
+        bssUserCertificationEntity.setDiscontinuedFlg(DelFlgEnum.OFF.getCode());
+
+        long startTime = System.currentTimeMillis();
+        // 有効期間
+        long endTime = startTime + expireMinutes * 60 * 1000;
+
+        bssUserCertificationEntity.setStartTime(DateUtils.getTime(startTime));
+        bssUserCertificationEntity.setEndTime(DateUtils.getTime(endTime));
+
+        this.insert(bssUserCertificationEntity);
+
+        // TODO Email 送信
+
+        return bssUserCertificationEntity.getId();
+    }
+
+    /**
+     * 認証コードの作成
+     * @return
+     */
+    private String generateCode() {
+        Random random = new Random();
+        StringBuilder code = new StringBuilder();
+        for (int i = 0; i < codeLength; i++) {
+            code.append(random.nextInt(10));
+        }
+        return code.toString();
+    }
+}

+ 6 - 0
farm-sankin/src/main/resources/application.yml

@@ -21,6 +21,12 @@ farm:
     - /api/auth/loginByCode
     - /api/auth/sendAuthCode
     - /api/auth/resendAuthCode
+  # 認証コード
+  authCode:
+    # 認証コード 長
+    length: 6
+    # 有効期間(デフォルト10分)
+    expireMinutes: 10
 
 # 開発環境の構成
 server:

+ 1 - 1
farm-sankin/src/main/resources/i18n/messages.properties

@@ -97,7 +97,7 @@ label.listDisplayItem=\u4E00\u89A7\u8868\u793A\u9805\u76EE
 label.mailAddress=\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9
 label.roleName=\u30ED\u30FC\u30EB\u540D
 label.remark=\u5099\u8003
-label.userName=\u30A2\u30AB\u30A6\u30F3\u30C8
+label.userName=\u30E6\u30FC\u30B6\u30FCID
 label.nickName=\u30E6\u30FC\u30B6\u30FC\u540D\u79F0
 label.password=\u30D1\u30B9\u30EF\u30FC\u30C9
 label.role=\u30ED\u30FC\u30EB