|
|
@@ -1,5 +1,8 @@
|
|
|
package com.dji.sample.manage.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.util.RandomUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.crypto.digest.DigestUtil;
|
|
|
import com.auth0.jwt.JWT;
|
|
|
import com.auth0.jwt.exceptions.TokenExpiredException;
|
|
|
import com.auth0.jwt.interfaces.DecodedJWT;
|
|
|
@@ -11,12 +14,14 @@ import com.dji.sample.common.model.CustomClaim;
|
|
|
import com.dji.sample.common.util.DesUtil;
|
|
|
import com.dji.sample.common.util.JwtUtil;
|
|
|
import com.dji.sample.component.mqtt.config.MqttPropertyConfiguration;
|
|
|
+import com.dji.sample.component.mqtt.model.MqttClientOptions;
|
|
|
+import com.dji.sample.component.mqtt.model.MqttUseEnum;
|
|
|
+import com.dji.sample.configuration.CustomConfiguration;
|
|
|
import com.dji.sample.manage.dao.IUserMapper;
|
|
|
-import com.dji.sample.manage.model.dto.DeviceDTO;
|
|
|
-import com.dji.sample.manage.model.dto.UserDTO;
|
|
|
-import com.dji.sample.manage.model.dto.UserListDTO;
|
|
|
-import com.dji.sample.manage.model.dto.WorkspaceDTO;
|
|
|
+import com.dji.sample.manage.dao.IWorkspaceMapper;
|
|
|
+import com.dji.sample.manage.model.dto.*;
|
|
|
import com.dji.sample.manage.model.entity.UserEntity;
|
|
|
+import com.dji.sample.manage.model.entity.WorkspaceEntity;
|
|
|
import com.dji.sample.manage.model.enums.UserTypeEnum;
|
|
|
import com.dji.sample.manage.service.IDeviceService;
|
|
|
import com.dji.sample.manage.service.IUserService;
|
|
|
@@ -24,6 +29,7 @@ import com.dji.sample.manage.service.IWorkspaceService;
|
|
|
import com.dji.sdk.common.HttpResultResponse;
|
|
|
import com.dji.sdk.common.Pagination;
|
|
|
import com.dji.sdk.common.PaginationData;
|
|
|
+import com.fasterxml.classmate.Annotations;
|
|
|
import org.apache.commons.codec.digest.DigestUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.http.HttpStatus;
|
|
|
@@ -32,15 +38,17 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
+import java.time.Duration;
|
|
|
import java.time.Instant;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.Optional;
|
|
|
-import java.util.UUID;
|
|
|
+import java.util.*;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+
|
|
|
+
|
|
|
@Service
|
|
|
@Transactional
|
|
|
public class UserServiceImpl implements IUserService {
|
|
|
@@ -57,6 +65,11 @@ public class UserServiceImpl implements IUserService {
|
|
|
@Autowired
|
|
|
private IDeviceService deviceService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IWorkspaceMapper workspaceMapper;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
public HttpResultResponse getUserByUsername(String username, String workspaceId) {
|
|
|
|
|
|
@@ -323,6 +336,102 @@ public class UserServiceImpl implements IUserService {
|
|
|
.eq("username", username));
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public HttpResultResponse userLogin(SignLoginDTO signLoginDTO) {
|
|
|
+ String username = signLoginDTO.getUsername();
|
|
|
+ String sign = signLoginDTO.getSignature();
|
|
|
+ String workSpaceId = signLoginDTO.getWorkspace_id();
|
|
|
+ String workSpaceName = signLoginDTO.getWorkspace_name();
|
|
|
+ String clientId = signLoginDTO.getClient_id();
|
|
|
+
|
|
|
+ Long timestamp = signLoginDTO.getTimestamp();
|
|
|
+
|
|
|
+
|
|
|
+ // Step 1: Convert the date-time Long to LocalDateTime
|
|
|
+ LocalDateTime dateTime = LocalDateTime.ofInstant(
|
|
|
+ Instant.ofEpochSecond(timestamp),
|
|
|
+ ZoneId.systemDefault());
|
|
|
+ // Step 2: Calculate the difference between the current time and the extracted time
|
|
|
+ LocalDateTime currentTime = LocalDateTime.now();
|
|
|
+ Duration duration = Duration.between(dateTime, currentTime);
|
|
|
+
|
|
|
+ // Step 3: Check if the difference is greater than 5 minutes
|
|
|
+ boolean isMoreThanFiveMinutes = duration.toMinutes() > 5;
|
|
|
+ if (isMoreThanFiveMinutes) {
|
|
|
+ return new HttpResultResponse()
|
|
|
+ .setCode(HttpStatus.UNAUTHORIZED.value())
|
|
|
+ .setMessage("invalid time");
|
|
|
+ }
|
|
|
+ if (sign != null) {
|
|
|
+ String dataInput = clientId+timestamp+username+workSpaceId+workSpaceName;
|
|
|
+ String generatedHash = DigestUtil.sha256Hex(dataInput.toUpperCase()+CustomConfiguration.signKey);
|
|
|
+ // Verify the hash
|
|
|
+ boolean isMatch = StrUtil.equals(generatedHash, sign);
|
|
|
+ if(!isMatch) {
|
|
|
+ return new HttpResultResponse()
|
|
|
+ .setCode(HttpStatus.UNAUTHORIZED.value())
|
|
|
+ .setMessage("invalid sign");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //用户入库
|
|
|
+ QueryWrapper<UserEntity> userWrapper = new QueryWrapper<>();
|
|
|
+ userWrapper.lambda().eq(UserEntity::getUserType,UserTypeEnum.SUPER_SYS.getVal())
|
|
|
+ .eq(UserEntity::getClientId,clientId);
|
|
|
+ UserEntity userEntity = mapper.selectOne(userWrapper);
|
|
|
+ if(userEntity == null) {
|
|
|
+ userEntity = new UserEntity();
|
|
|
+ userEntity.setUsername(username);
|
|
|
+ userEntity.setUserId(UUID.randomUUID().toString());
|
|
|
+ userEntity.setUserType(UserTypeEnum.SUPER_SYS.getVal());
|
|
|
+ userEntity.setPassword("");
|
|
|
+ userEntity.setWorkspaceId(workSpaceId);
|
|
|
+ userEntity.setMqttUsername(mqttPropertyConfiguration.mqttConnectOptions().getUserName());
|
|
|
+ userEntity.setMqttPassword(String.valueOf(mqttPropertyConfiguration.mqttConnectOptions().getPassword()));
|
|
|
+ userEntity.setClientId(clientId);
|
|
|
+ mapper.insert(userEntity);
|
|
|
+ } else {
|
|
|
+ userEntity.setMqttUsername(mqttPropertyConfiguration.mqttConnectOptions().getUserName());
|
|
|
+ userEntity.setMqttPassword(String.valueOf(mqttPropertyConfiguration.mqttConnectOptions().getPassword()));
|
|
|
+ userEntity.setUsername(username);
|
|
|
+ userEntity.setWorkspaceId(workSpaceId);
|
|
|
+ mapper.updateById(userEntity);
|
|
|
+ }
|
|
|
+
|
|
|
+ //工作空间入库
|
|
|
+ QueryWrapper<WorkspaceEntity> workSpaceWrapper = new QueryWrapper<>();
|
|
|
+ workSpaceWrapper.lambda().eq(WorkspaceEntity::getWorkspaceId,workSpaceId);
|
|
|
+ WorkspaceEntity workspace = workspaceMapper.selectOne(workSpaceWrapper);
|
|
|
+ if(workspace == null) {
|
|
|
+ workspace = new WorkspaceEntity();
|
|
|
+ workspace.setWorkspaceId(workSpaceId);
|
|
|
+ workspace.setWorkspaceName(workSpaceName);
|
|
|
+ workspace.setPlatformName("Cloud Api Platform");
|
|
|
+ workspace.setBindCode(RandomUtil.randomString(6));
|
|
|
+ workspaceMapper.insert(workspace);
|
|
|
+ } else {
|
|
|
+ workspace.setWorkspaceName(workSpaceName);
|
|
|
+ workspaceMapper.updateById(workspace);
|
|
|
+ }
|
|
|
+
|
|
|
+ CustomClaim customClaim = new CustomClaim(userEntity.getUserId(),
|
|
|
+ username, UserTypeEnum.SUPER_SYS.getVal(),
|
|
|
+ workSpaceId);
|
|
|
+
|
|
|
+ // create token
|
|
|
+ String token = JwtUtil.createToken(customClaim.convertToMap());
|
|
|
+
|
|
|
+ UserDTO userDTO = new UserDTO();
|
|
|
+ userDTO.setUsername(username);
|
|
|
+ userDTO.setWorkspaceId(workSpaceId);
|
|
|
+ userDTO.setUserId(userEntity.getUserId());
|
|
|
+ userDTO.setMqttUsername(userEntity.getMqttUsername());
|
|
|
+ userDTO.setMqttPassword(userEntity.getMqttPassword());
|
|
|
+ userDTO.setUserType(UserTypeEnum.SUPER_SYS.getVal());
|
|
|
+ userDTO.setMqttAddr(MqttPropertyConfiguration.getBasicMqttAddress());
|
|
|
+ userDTO.setAccessToken(token);
|
|
|
+ return HttpResultResponse.success(userDTO);
|
|
|
+ }
|
|
|
+
|
|
|
private UserEntity getApiUser(String clientId) {
|
|
|
return mapper.selectOne(new QueryWrapper<UserEntity>()
|
|
|
.eq("client_id", clientId)
|
|
|
@@ -353,4 +462,28 @@ public class UserServiceImpl implements IUserService {
|
|
|
.mqttAddr(MqttPropertyConfiguration.getBasicMqttAddress())
|
|
|
.build();
|
|
|
}
|
|
|
+
|
|
|
+ private static String extractDateTime(String inputString,String userCode) {
|
|
|
+ // Step 1: Define the pattern
|
|
|
+ Pattern pattern = Pattern.compile(userCode+"(\\d+)"+userCode);
|
|
|
+ // Step 2: Create a matcher for the input string
|
|
|
+ Matcher matcher = pattern.matcher(inputString);
|
|
|
+ // Step 3: Check if the pattern matches
|
|
|
+ if (matcher.find()) {
|
|
|
+ // Step 4: Extract the number
|
|
|
+ String number = matcher.group(1); // group(1) refers to the first capturing group
|
|
|
+ return number;
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static LocalDateTime parseTimestamp(String timestampString) {
|
|
|
+ // Convert the timestamp to LocalDateTime
|
|
|
+ long timestamp = Long.parseLong(timestampString);
|
|
|
+ return LocalDateTime.ofInstant(
|
|
|
+ Instant.ofEpochSecond(timestamp),
|
|
|
+ ZoneId.systemDefault()
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|