ソースを参照

农家登录二次认证

于俊龙 1 ヶ月 前
コミット
e1c21fc8e2
18 ファイル変更272 行追加143 行削除
  1. 10 0
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/constants/FarmConstants.java
  2. 9 2
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/mapper/BssUserCertificationBaseMapper.java
  3. 10 2
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/service/IBssUserCertificationBaseService.java
  4. 13 7
      farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/service/impl/BssUserCertificationBaseServiceImpl.java
  5. 47 0
      farm-common-biz/src/main/resources/mapper/BssUserCertificationBaseMapper.xml
  6. 8 6
      farm-common/src/main/java/jp/yamoto/farm/common/core/domain/entity/SysUser.java
  7. 1 1
      farm-common/src/main/java/jp/yamoto/farm/common/exception/handler/GlobalExceptionHandler.java
  8. 2 2
      farm-common/src/main/java/jp/yamoto/farm/common/security/handle/LogoutSuccessHandlerImpl.java
  9. 0 6
      farm-crm/src/main/resources/application.yml
  10. 2 2
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/auth/domain/AuthTempTokenBo.java
  11. 58 68
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/auth/service/AuthService.java
  12. 37 6
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/auth/service/UserDetailsServiceImpl.java
  13. 0 5
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/domain/bo/BssUserAuthCodeMailBo.java
  14. 17 2
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/service/IBssUserCertificationService.java
  15. 53 18
      farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/service/impl/BssUserCertificationServiceImpl.java
  16. 3 8
      farm-sankin/src/main/java/jp/yamoto/farm/sankin/web/controller/AuthController.java
  17. 0 6
      farm-sankin/src/main/resources/application.yml
  18. 2 2
      farm-sankin/src/main/resources/i18n/messages.properties

+ 10 - 0
farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/constants/FarmConstants.java

@@ -4,4 +4,14 @@ package jp.yamoto.farm.common.biz.constants;
  * 農家支援 & CRM システム 共通定数情報
  */
 public class FarmConstants {
+
+    /**
+     * 二次認証コード長
+     */
+    public static final String SYS_AUTH_CODE_LENGTH = "sys.auth.code.length";
+
+    /**
+     * 二次認証有効期間(分)
+     */
+    public static final String SYS_AUTH_CODE_EXPIRE_MINUTES = "sys.auth.code.expireMinutes";
 }

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

@@ -53,11 +53,18 @@ public interface BssUserCertificationBaseMapper {
     public int deleteById(String id);
 
     /**
-     * 廃止
+     * 農家IDによる認証記録を廃止
      *
      * @param bssUserCertification
      * @return
      */
-    int deleteLogicByIdAndVersion(BssUserCertificationEntity bssUserCertification);
+    int deleteLogicByFarmId(BssUserCertificationEntity bssUserCertification);
 
+    /**
+     * IDによる認証記録を廃止
+     *
+     * @param bssUserCertification
+     * @return
+     */
+    int deleteLogicById(BssUserCertificationEntity bssUserCertification);
 }

+ 10 - 2
farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/service/IBssUserCertificationBaseService.java

@@ -53,10 +53,18 @@ public interface IBssUserCertificationBaseService {
     public int deleteById(String id);
 
     /**
-     * 廃止
+     * 農家IDによる認証記録を廃止
      *
      * @param bssUserCertification
      * @return
      */
-    int deleteLogicByIdAndVersion(BssUserCertificationEntity bssUserCertification);
+    int deleteLogicByFarmId(BssUserCertificationEntity bssUserCertification);
+
+    /**
+     * IDによる認証記録を廃止
+     *
+     * @param bssUserCertification
+     * @return
+     */
+    int deleteLogicById(BssUserCertificationEntity bssUserCertification);
 }

+ 13 - 7
farm-common-biz/src/main/java/jp/yamoto/farm/common/biz/service/impl/BssUserCertificationBaseServiceImpl.java

@@ -102,18 +102,24 @@ public class BssUserCertificationBaseServiceImpl implements IBssUserCertificatio
     }
 
     /**
-     * 廃止
+     * 農家IDによる認証記録を廃止
      *
      * @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;
+    public int deleteLogicByFarmId(BssUserCertificationEntity bssUserCertification){
+        return bssUserCertificationBaseMapper.deleteLogicByFarmId(bssUserCertification);
     }
 
+    /**
+     * IDによる認証記録を廃止
+     *
+     * @param bssUserCertification
+     * @return
+     */
+    @Override
+    public int deleteLogicById(BssUserCertificationEntity bssUserCertification){
+        return bssUserCertificationBaseMapper.deleteLogicByFarmId(bssUserCertification);
+    }
 }

+ 47 - 0
farm-common-biz/src/main/resources/mapper/BssUserCertificationBaseMapper.xml

@@ -279,4 +279,51 @@
 
     </delete>
 
+    <!--廃止-->
+    <update id="deleteLogicByFarmId" 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>
+            farmer_id = #{farmerId}
+        and discontinued_flg = '0'
+        </where>
+    </update>
+
+    <!--廃止-->
+    <update id="deleteLogicById" 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>
+            id = #{id}
+        </where>
+    </update>
+
  </mapper>

+ 8 - 6
farm-common/src/main/java/jp/yamoto/farm/common/core/domain/entity/SysUser.java

@@ -1,11 +1,11 @@
 package jp.yamoto.farm.common.core.domain.entity;
 
-import java.util.Date;
-import java.util.List;
-import jakarta.validation.constraints.*;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
 import jp.yamoto.farm.common.annotation.DecryptField;
 import jp.yamoto.farm.common.annotation.Excel;
-import jp.yamoto.farm.common.annotation.Excels;
+import jp.yamoto.farm.common.core.domain.BaseEntity;
 import jp.yamoto.farm.common.validator.annotation.LmLength;
 import jp.yamoto.farm.common.validator.annotation.LmNotBlank;
 import jp.yamoto.farm.common.validator.annotation.LmPassword;
@@ -15,7 +15,9 @@ import jp.yamoto.farm.common.validator.utils.ValidatorGroup;
 import jp.yamoto.farm.common.xss.Xss;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
-import jp.yamoto.farm.common.core.domain.BaseEntity;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * sys_user
@@ -34,7 +36,7 @@ public class SysUser extends BaseEntity
      * ユーザーアカウント
      */
     @DecryptField
-    @Excel(name = "アカウント")
+    @Excel(name = "ユーザーID")
     @LmNotBlank(params = {"{userName}"}, groups = {ValidatorGroup.AddGroup.class, ValidatorGroup.UpdateGroup.class})
     @LmLength(min = 1, max = 100, params = {"{userName}", "100"}, groups = {ValidatorGroup.AddGroup.class, ValidatorGroup.UpdateGroup.class})
     @LmType(params = {"{userName}", "{halfAlphabetNumericSymbol}"}, checkType = CheckTypeEnum.ALPHABET_NUMERIC_SYMBOL, groups = {ValidatorGroup.AddGroup.class, ValidatorGroup.UpdateGroup.class})

+ 1 - 1
farm-common/src/main/java/jp/yamoto/farm/common/exception/handler/GlobalExceptionHandler.java

@@ -58,7 +58,7 @@ public class GlobalExceptionHandler
     @ExceptionHandler(ServiceException.class)
     public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request)
     {
-        log.error(e.getMessage(), e);
+        //log.error(e.getMessage(), e);
         Integer code = e.getCode();
         return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
     }

+ 2 - 2
farm-common/src/main/java/jp/yamoto/farm/common/security/handle/LogoutSuccessHandlerImpl.java

@@ -51,8 +51,8 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler
             // ユーザーキャッシュレコードの削除
             tokenService.delLoginUser(loginUser.getToken());
             // ユーザー終了ログの記録
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), userName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), userName, Constants.LOGOUT, MessageUtils.message("I0009")));
         }
-        ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success(MessageUtils.message("user.logout.success"))));
+        ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success(MessageUtils.message("I0009"))));
     }
 }

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

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

+ 2 - 2
farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/auth/domain/AuthTempTokenBo.java

@@ -14,7 +14,7 @@ public class AuthTempTokenBo {
     private String sendVerifyCodeId;
 
     /**
-     * EMail
+     * ユーザーID
      */
-    private String mailAddess;
+    private String userId;
 }

+ 58 - 68
farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/auth/service/AuthService.java

@@ -63,6 +63,7 @@ public class AuthService {
      * @param password パスワード
      * @return
      */
+    @Transactional
     public String login(String username, String password)
     {
         // ユーザー
@@ -73,6 +74,7 @@ public class AuthService {
             throw new UserPasswordNotMatchException();
         }
 
+
         // 認証コードを送信する
         BssUserAuthCodeMailBo bssUserAuthCodeMailBo = new BssUserAuthCodeMailBo();
         bssUserAuthCodeMailBo.setUserId(userDetails.getFarmerId());
@@ -82,7 +84,7 @@ public class AuthService {
 
         String sendId = bssUserCertificationService.sendAuthCodeByEmail(bssUserAuthCodeMailBo);
 
-        return this.createTempToken(sendId, userDetails.getMailAddress());
+        return this.createTempToken(sendId, userDetails.getFarmerId());
     }
 
     /**
@@ -95,14 +97,11 @@ public class AuthService {
 
         // ユーザー認証
         Authentication authentication = null;
-        FarmerUserInfo userDetails = null;
+        AuthTempTokenBo authTempTokenBo = getTempToken(authSecondBo.getTempToken());
 
         try
         {
-            AuthTempTokenBo authTempTokenBo = getTempToken(authSecondBo.getTempToken());
-            // ユーザー
-            userDetails = this.selectUserByMailAddress(authTempTokenBo.getMailAddess());
-            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails.getFarmerId(), authSecondBo.getVerifyCode());
+            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(authTempTokenBo.getUserId(), authSecondBo.getVerifyCode());
             AuthenticationContextHolder.setContext(authenticationToken);
             authentication = authenticationManager.authenticate(authenticationToken);
         }
@@ -110,12 +109,12 @@ public class AuthService {
         {
             if (e instanceof BadCredentialsException)
             {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), userDetails.getFarmerId(), Constants.LOGIN_FAIL, MessageUtils.message("E0063")));
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), authTempTokenBo.getUserId(), Constants.LOGIN_FAIL, MessageUtils.message("E0063")));
                 throw new AuthVerifyCodeNotMatchException();
             }
             else
             {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), userDetails.getFarmerId(), Constants.LOGIN_FAIL, e.getMessage()));
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), authTempTokenBo.getUserId(), Constants.LOGIN_FAIL, e.getMessage()));
                 throw new ServiceException(e.getMessage());
             }
         }
@@ -124,7 +123,7 @@ public class AuthService {
             AuthenticationContextHolder.clearContext();
         }
         // I0011=二次認証に成功しました。
-        AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), userDetails.getFarmerId(), Constants.LOGIN_SUCCESS, MessageUtils.message("I0011")));
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), authTempTokenBo.getUserId(), Constants.LOGIN_SUCCESS, MessageUtils.message("I0011")));
 
         LoginUser<FarmerUserInfo> loginUser = (LoginUser) authentication.getPrincipal();
 
@@ -135,7 +134,46 @@ public class AuthService {
     }
 
     /**
+     * 認証コードを送信します。
+     * パスワードを忘れた方
+     *
+     * @param authSendVerifyCodeBo
+     *
+     * @return 一時token
+     */
+    @Transactional
+    public String sendAuthCode(AuthSendVerifyCodeBo authSendVerifyCodeBo){
+        // メールアドレス 必須入力
+        if(ValueUtils.isEmpty(authSendVerifyCodeBo.getMailAddress())){
+            // E0003={0}は必須入力です。
+            throw new ServiceException(MessageUtils.message("E0003", MessageUtils.message("mailAddress")));
+        }
+
+        // ユーザー メールアドレス
+        FarmerUserInfo user = farmerMapper.selectUserByMailAddress(DecryptUtils.encryptAES(authSendVerifyCodeBo.getMailAddress()));
+
+        if(user == null){
+            // E0062 確認用のパスワードと新パスワードが一致しません。
+            throw new ServiceException(MessageUtils.message("E0062", authSendVerifyCodeBo.getMailAddress()));
+        }
+
+        // 認証コードを送信する
+        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 this.createTempToken(sendId, user.getFarmerId());
+    }
+
+
+    /**
      * 認証コードを再送信する
+     *
+     * @return 一時token
      */
     @Transactional
     public String resendAuthCode(AuthReSendVerifyCodeBo authReSendVerifyCodeBo) throws Exception {
@@ -143,7 +181,7 @@ public class AuthService {
         AuthTempTokenBo authTempTokenBo = getTempToken(authReSendVerifyCodeBo.getTempToken());
 
         // ユーザー
-        FarmerUserInfo userDetails = this.selectUserByMailAddress(authTempTokenBo.getMailAddess());
+        FarmerUserInfo userDetails = this.selectUserByUserName(authTempTokenBo.getUserId());
 
         // 認証コードを再送信する
         BssUserAuthCodeMailBo bssUserAuthCodeMailBo = new BssUserAuthCodeMailBo();
@@ -151,15 +189,15 @@ public class AuthService {
         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());
+        return this.createTempToken(sendId, userDetails.getFarmerId());
     }
 
     /**
      * パスワード再設定
+     *
      * @param authResetPwdBo
      */
     @Transactional
@@ -180,41 +218,11 @@ public class AuthService {
     }
 
     /**
-     * 認証コードを送信します。
-     * パスワードを忘れた方
+     * ユーザーネームでユーザーを查詢
      *
-     * @param authSendVerifyCodeBo
-     *
-     * @return 一時token
+     * @param username ユーザーネーム
+     * @return ユーザーオブジェクト情報
      */
-    @Transactional
-    public String sendAuthCode(AuthSendVerifyCodeBo authSendVerifyCodeBo){
-        // メールアドレス 必須入力
-        if(ValueUtils.isEmpty(authSendVerifyCodeBo.getMailAddress())){
-            // E0003={0}は必須入力です。
-            throw new ServiceException(MessageUtils.message("E0003", MessageUtils.message("mailAddress")));
-        }
-
-        // ユーザー メールアドレス
-        FarmerUserInfo user = farmerMapper.selectUserByMailAddress(authSendVerifyCodeBo.getMailAddress());
-
-        if(user == null){
-            // E0062 確認用のパスワードと新パスワードが一致しません。
-            throw new ServiceException(MessageUtils.message("E0062", authSendVerifyCodeBo.getMailAddress()));
-        }
-
-        // 認証コードを送信する
-        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 this.createTempToken(sendId, user.getMailAddress());
-    }
-
     public FarmerUserInfo selectUserByUserName(String username){
         // ユーザー
         FarmerUserInfo userDetails = farmerMapper.selectUserByUserName(username);
@@ -233,24 +241,6 @@ public class AuthService {
         return userDetails;
     }
 
-    public FarmerUserInfo selectUserByMailAddress(String mailAddress) throws Exception {
-        // ユーザー
-        FarmerUserInfo userDetails = farmerMapper.selectUserByMailAddress(DecryptUtils.encryptAES(mailAddress));
-
-        if (StringUtils.isNull(userDetails))
-        {
-            log.info("ログインユーザ:{}は存在しません.", mailAddress);
-            throw new ServiceException(MessageUtils.message("E0050", mailAddress));
-        }
-        else if (UserStatus.DISABLE.getCode().equals(userDetails.getDiscontinuedFlg()))
-        {
-            log.info("ログインユーザ:{}が停止されました", mailAddress);
-            throw new ServiceException(MessageUtils.message("E0049"));
-        }
-
-        return userDetails;
-    }
-
     /**
      * ロギングログイン情報
      *
@@ -265,17 +255,17 @@ public class AuthService {
      * 認証トークンの生成
      *
      * @param sendAuthVerifyCodeId ユーザー認証情報ID
-     * @param email              メールアドレス
+     * @param userId               ユーザーID
      * @return 認証トークン
      */
-    private String createTempToken(String sendAuthVerifyCodeId, String email) {
+    private String createTempToken(String sendAuthVerifyCodeId, String userId) {
         String resultToken = StringUtils.EMPTY;
         try {
             Map<String, Object> encryptMap = Map.of(
                     "sendId", sendAuthVerifyCodeId,
-                    "sendAddress", email);
+                    "userId", userId);
             String tokenFormat = JsonUtil.toJsonStr(encryptMap);
-            resultToken = DecryptUtils.decryptAES(tokenFormat);
+            resultToken = DecryptUtils.encryptAES(tokenFormat);
         } catch (Exception ex) {
             log.error("【認証ユーザー異常】一時トークンの生成に失敗しました。", ex);
             throw new ServiceException("一時トークン生成失敗しますので、管理者を連絡してください。");
@@ -307,7 +297,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("sendAddress")));
+            result.setUserId(String.valueOf(tokenMap.get("userId")));
         }
 
         return result;

+ 37 - 6
farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/auth/service/UserDetailsServiceImpl.java

@@ -1,14 +1,16 @@
 package jp.yamoto.farm.sankin.biz.auth.service;
 
+import jp.yamoto.farm.common.biz.domain.entity.BssUserCertificationEntity;
+import jp.yamoto.farm.common.biz.enums.SankinPgIdEnum;
 import jp.yamoto.farm.common.core.domain.entity.FarmerUserInfo;
 import jp.yamoto.farm.common.core.domain.model.LoginUser;
 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.security.context.AuthenticationContextHolder;
-import jp.yamoto.farm.common.utils.MessageUtils;
-import jp.yamoto.farm.common.utils.SecurityUtils;
-import jp.yamoto.farm.common.utils.StringUtils;
+import jp.yamoto.farm.common.utils.*;
 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;
@@ -18,6 +20,8 @@ import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
+
 /**
  * ユーザ認証処理
  *
@@ -31,6 +35,9 @@ public class UserDetailsServiceImpl implements UserDetailsService
     @Autowired
     private FarmerUserMapper farmerUserMapper;
 
+    @Autowired
+    private IBssUserCertificationService bssUserCertificationService;
+
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
     {
@@ -48,18 +55,42 @@ public class UserDetailsServiceImpl implements UserDetailsService
         }
 
         // 認証コード
-        String authCode = validate("");
+        String authCode = validate();
 
         return createLoginUser(user, authCode);
     }
 
-    public String validate(String userAuthCode) {
+    public String validate() {
 
         Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext();
         String username = usernamePasswordAuthenticationToken.getName();
         String authCode = usernamePasswordAuthenticationToken.getCredentials().toString();
 
-        return authCode;
+        // ユーザIDに認証を取得する
+        BssUserCertificationEntity bssUserCertificationEntity = bssUserCertificationService.getAuthCodeByUserId(username);
+
+        Date nowTime = DateUtils.getNowDate();
+        Date endTime = DateUtils.parseDate(bssUserCertificationEntity.getEndTime());
+
+        // E0013=認証コードの有効期限が切れました。
+        if(nowTime.compareTo(endTime) > 0){
+            log.info("ログインユーザ:{}が認証コードの有効期限が切れました。", username);
+            throw new ServiceException(MessageUtils.message("E0013"));
+        }
+
+        if(ValueUtils.isNotEqual(bssUserCertificationEntity.getCertificationCode(), authCode)){
+            log.info("ログインユーザ:{}が認証コードが無効です。", username);
+            throw new AuthVerifyCodeNotMatchException();
+        }
+
+        bssUserCertificationEntity.setUpdatePgId(SankinPgIdEnum.N003.getCode());
+        bssUserCertificationEntity.setUpdateBy(username);
+        bssUserCertificationEntity.setUpdateBy(DateUtils.getTime());
+
+        // IDによる認証記録を廃止
+        bssUserCertificationService.deleteLogicById(bssUserCertificationEntity);
+
+        return bssUserCertificationEntity.getCertificationCode();
     }
 
     public UserDetails createLoginUser(FarmerUserInfo user, String authCode)

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

@@ -30,9 +30,4 @@ public class BssUserAuthCodeMailBo {
      * プログラムID
      */
     private String pgId;
-
-    /**
-     * 前回送信ID
-     */
-    private String preSendId;
 }

+ 17 - 2
farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/service/IBssUserCertificationService.java

@@ -1,6 +1,6 @@
 package jp.yamoto.farm.sankin.biz.service;
 
-import jp.yamoto.farm.common.biz.service.IBssUserCertificationBaseService;
+import jp.yamoto.farm.common.biz.domain.entity.BssUserCertificationEntity;
 import jp.yamoto.farm.sankin.biz.domain.bo.BssUserAuthCodeMailBo;
 
 /**
@@ -8,7 +8,14 @@ import jp.yamoto.farm.sankin.biz.domain.bo.BssUserAuthCodeMailBo;
  *
  * @author nextosd
  */
-public interface IBssUserCertificationService extends IBssUserCertificationBaseService {
+public interface IBssUserCertificationService {
+
+    /**
+     * ユーザIDに認証コードを取得する
+     * @param userId
+     * @return 認証情報
+     */
+    BssUserCertificationEntity getAuthCodeByUserId(String userId);
 
     /**
      * 認証コード - EMail送信する
@@ -17,4 +24,12 @@ public interface IBssUserCertificationService extends IBssUserCertificationBaseS
      * @return ID
      */
     String sendAuthCodeByEmail(BssUserAuthCodeMailBo params);
+
+    /**
+     * IDによる認証記録を廃止
+     *
+     * @param bssUserCertification
+     * @return
+     */
+     int deleteLogicById(BssUserCertificationEntity bssUserCertification);
 }

+ 53 - 18
farm-sankin-biz/src/main/java/jp/yamoto/farm/sankin/biz/service/impl/BssUserCertificationServiceImpl.java

@@ -1,19 +1,23 @@
 package jp.yamoto.farm.sankin.biz.service.impl;
 
+import jp.yamoto.farm.common.biz.constants.FarmConstants;
 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.biz.service.IBssUserCertificationBaseService;
+import jp.yamoto.farm.common.biz.service.ISysConfigService;
 import jp.yamoto.farm.common.core.enums.DelFlgEnum;
 import jp.yamoto.farm.common.exception.ServiceException;
+import jp.yamoto.farm.common.utils.ConvertUtils;
 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.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Random;
 
 /**
@@ -22,15 +26,34 @@ import java.util.Random;
  * @author nextosd
  */
 @Service
-public class BssUserCertificationServiceImpl extends BssUserCertificationBaseServiceImpl implements IBssUserCertificationService {
+public class BssUserCertificationServiceImpl implements IBssUserCertificationService {
 
-    // Length
-    @Value("${farm.authCode.length:6}")
-    private int codeLength;
+    @Autowired
+    private IBssUserCertificationBaseService bssUserCertificationBaseService;
 
-    // 有効期間
-    @Value("${farm.authCode.expireMinutes:5}")
-    private int expireMinutes;
+    @Autowired
+    private ISysConfigService sysConfigService;
+
+    /**
+     * ユーザIDに認証コードを取得する
+     * @param userId
+     * @return 認証コード
+     */
+    @Override
+    public BssUserCertificationEntity getAuthCodeByUserId(String userId) {
+        BssUserCertificationEntity bssUserCertificationEntityQuery = new BssUserCertificationEntity();
+        bssUserCertificationEntityQuery.setFarmerId(userId);
+        bssUserCertificationEntityQuery.setDiscontinuedFlg(DelFlgEnum.OFF.getCode());
+
+        List<BssUserCertificationEntity> bssUserCertificationList = bssUserCertificationBaseService.selectList(bssUserCertificationEntityQuery);
+
+        if(ValueUtils.isEmpty(bssUserCertificationList) || ValueUtils.isEmpty(bssUserCertificationList.get(0).getCertificationCode())){
+            // E0011 ユーザーが送信した認証情報に存在ありません。
+            throw new ServiceException(MessageUtils.message("E0011"));
+        }
+
+        return bssUserCertificationList.get(0);
+    }
 
     /**
      * 認証コード - EMail送信する
@@ -51,12 +74,11 @@ public class BssUserCertificationServiceImpl extends BssUserCertificationBaseSer
             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 bssUserCertificationEntityDelete = new BssUserCertificationEntity();
+        bssUserCertificationEntityDelete.setUpdatePgId(params.getPgId());
+        bssUserCertificationEntityDelete.setFarmerId(params.getUserId());
+        bssUserCertificationBaseService.deleteLogicByFarmId(bssUserCertificationEntityDelete);
 
         BssUserCertificationEntity bssUserCertificationEntity = new BssUserCertificationEntity();
         bssUserCertificationEntity.setId(IdUtils.nextIdStr());
@@ -69,14 +91,15 @@ public class BssUserCertificationServiceImpl extends BssUserCertificationBaseSer
         bssUserCertificationEntity.setCertificationCode(this.generateCode());
         bssUserCertificationEntity.setDiscontinuedFlg(DelFlgEnum.OFF.getCode());
 
+        // 開始時間
         long startTime = System.currentTimeMillis();
-        // 有効
-        long endTime = startTime + expireMinutes * 60 * 1000;
+        // 有効終了時
+        long endTime = startTime + ConvertUtils.toInt(sysConfigService.selectConfigByKey(FarmConstants.SYS_AUTH_CODE_EXPIRE_MINUTES), 10) * 60 * 1000;
 
         bssUserCertificationEntity.setStartTime(DateUtils.getTime(startTime));
         bssUserCertificationEntity.setEndTime(DateUtils.getTime(endTime));
 
-        this.insert(bssUserCertificationEntity);
+        bssUserCertificationBaseService.insert(bssUserCertificationEntity);
 
         // TODO Email 送信
 
@@ -84,12 +107,24 @@ public class BssUserCertificationServiceImpl extends BssUserCertificationBaseSer
     }
 
     /**
+     * 農家IDによる認証記録を廃止
+     *
+     * @param bssUserCertification
+     * @return
+     */
+    @Override
+    public int deleteLogicById(BssUserCertificationEntity bssUserCertification) {
+        return bssUserCertificationBaseService.deleteLogicById(bssUserCertification);
+    }
+
+    /**
      * 認証コードの作成
      * @return
      */
     private String generateCode() {
         Random random = new Random();
         StringBuilder code = new StringBuilder();
+        int codeLength = ConvertUtils.toInt(sysConfigService.selectConfigByKey(FarmConstants.SYS_AUTH_CODE_LENGTH), 10);
         for (int i = 0; i < codeLength; i++) {
             code.append(random.nextInt(10));
         }

+ 3 - 8
farm-sankin/src/main/java/jp/yamoto/farm/sankin/web/controller/AuthController.java

@@ -38,10 +38,7 @@ public class AuthController
     @PostMapping("/login")
     public AjaxResult login(@RequestBody LoginBody loginBody)
     {
-        // Token
-        String token = authService.login(loginBody.getUsername(), loginBody.getPassword());
-
-        return AjaxResult.success(token);
+        return AjaxResult.success(authService.login(loginBody.getUsername(), loginBody.getPassword()));
     }
 
     /**
@@ -59,8 +56,7 @@ public class AuthController
      */
     @PostMapping("/sendAuthCode")
     public AjaxResult sendAuthCode(@RequestBody @Validated AuthSendVerifyCodeBo authSendVerifyCodeBo) {
-        authService.sendAuthCode(authSendVerifyCodeBo);
-        return AjaxResult.success();
+        return AjaxResult.success(authService.sendAuthCode(authSendVerifyCodeBo));
     }
 
     /**
@@ -68,8 +64,7 @@ public class AuthController
      */
     @PostMapping("/resendAuthCode")
     public AjaxResult resendAuthCode(@RequestBody @Validated AuthReSendVerifyCodeBo authReSendVerifyCodeBo) throws Exception {
-        authService.resendAuthCode(authReSendVerifyCodeBo);
-        return AjaxResult.success();
+        return AjaxResult.success(authService.resendAuthCode(authReSendVerifyCodeBo));
     }
 
     /**

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

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

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

@@ -8,9 +8,9 @@ E0007=\u8A72\u5F53\u30C7\u30FC\u30BF\u306F\u65E2\u306B\u5225\u306E\u30E6\u30FC\u
 E0008=\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306E\u5F62\u5F0F\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093\u3002
 E0009={0}\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002
 E0010=\u30E6\u30FC\u30B6\u30FC\u540D\u304C\u9593\u9055\u3063\u3066\u3044\u307E\u3059\u3002
-E0011=\u8A72\u5F53\u691C\u5B9A\u7A2E\u985E\u306F\u65E2\u306B\u7D10\u4ED8\u3051\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u5B8C\u5168\u306B\u524A\u9664\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002
+E0011=\u30E6\u30FC\u30B6\u30FC\u304C\u9001\u4FE1\u3057\u305F\u8A8D\u8A3C\u60C5\u5831\u306B\u5B58\u5728\u3042\u308A\u307E\u305B\u3093\u3002
 E0012={0}\u306E\u91CD\u8907\u767B\u9332\u306F\u3067\u304D\u307E\u305B\u3093\u3002
-E0013=\u8A72\u5F53\u691C\u5B9A\u7A2E\u985E\u306F\u65E2\u306B\u7D10\u4ED8\u3051\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u4E26\u3073\u9806\u3092\u4FEE\u6B63\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002
+E0013=\u8A8D\u8A3C\u30B3\u30FC\u30C9\u306E\u6709\u52B9\u671F\u9650\u304C\u5207\u308C\u307E\u3057\u305F\u3002
 E0014={0}\u306F10\u4EF6\u3092\u4E0A\u56DE\u3063\u3066\u306F\u306A\u3089\u306A\u3044\u3002
 E0015=\u8A8D\u8A3C\u60C5\u5831\u304C\u8AA4\u3063\u3066\u3044\u308B\u305F\u3081\u3001<br>\u6210\u7E3E\u60C5\u5831\u306E\u53D6\u5F97\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002
 E0016={0}\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002