Commit d3bd8f23ece5963833596867325f323423f04012

Authored by xp.Huang
2 parents 2fdb139a 6bc3bbd7

Merge branch '20220424' into 'master'

20220424

See merge request huang/thingsboard3.3.2!84
... ... @@ -5,7 +5,6 @@ import io.swagger.annotations.Api;
5 5 import io.swagger.annotations.ApiOperation;
6 6 import lombok.RequiredArgsConstructor;
7 7 import org.jetbrains.annotations.NotNull;
8   -import org.springframework.security.access.prepost.PreAuthorize;
9 8 import org.springframework.validation.annotation.Validated;
10 9 import org.springframework.web.bind.annotation.*;
11 10 import org.thingsboard.server.common.data.StringUtils;
... ... @@ -13,26 +12,21 @@ import org.thingsboard.server.common.data.User;
13 12 import org.thingsboard.server.common.data.exception.ThingsboardException;
14 13 import org.thingsboard.server.common.data.id.UserId;
15 14 import org.thingsboard.server.common.data.security.UserCredentials;
16   -import org.thingsboard.server.common.data.security.model.JwtToken;
17 15 import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
18 16 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
19   -import org.thingsboard.server.common.data.yunteng.dto.YtOpinionDTO;
  17 +import org.thingsboard.server.common.data.yunteng.dto.UserDTO;
20 18 import org.thingsboard.server.common.data.yunteng.dto.YtThirdUserDTO;
21 19 import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum;
22 20 import org.thingsboard.server.common.data.yunteng.enums.ThirdPlatformEnum;
23 21 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
24 22 import org.thingsboard.server.controller.BaseController;
25   -import org.thingsboard.server.dao.yunteng.entities.YtOpinionEntity;
26 23 import org.thingsboard.server.dao.yunteng.entities.YtThirdUserEntity;
27   -import org.thingsboard.server.dao.yunteng.service.YtOpinionService;
28 24 import org.thingsboard.server.dao.yunteng.service.YtThirdPlatformService;
29 25 import org.thingsboard.server.service.security.auth.jwt.RefreshTokenRepository;
30   -import org.thingsboard.server.service.security.auth.rest.LoginResponse;
31 26 import org.thingsboard.server.service.security.model.JwtTokenPair;
32 27 import org.thingsboard.server.service.security.model.SecurityUser;
33 28 import org.thingsboard.server.service.security.model.UserPrincipal;
34 29 import org.thingsboard.server.service.security.model.token.JwtTokenFactory;
35   -import org.thingsboard.server.service.security.permission.Operation;
36 30
37 31 import java.util.UUID;
38 32
... ... @@ -71,8 +65,8 @@ public class YtThirdPlatformController extends BaseController {
71 65 @ApiOperation("绑定")
72 66 public JwtTokenPair saveOrUpdateAlarmProfile(
73 67 @Validated @RequestBody YtThirdUserDTO dto) throws ThingsboardException {
74   - String tbUserId = thirdService.saveOrUpdate(dto);
75   - return buildJwtToken(tbUserId);
  68 + UserDTO userDto = thirdService.saveOrUpdate(dto);
  69 + return buildJwtToken(userDto);
76 70 }
77 71
78 72 @DeleteMapping
... ... @@ -87,20 +81,24 @@ public class YtThirdPlatformController extends BaseController {
87 81 @ApiOperation("第三方登录")
88 82 public JwtTokenPair login(@PathVariable("thirdId") String thirdId)
89 83 throws ThingsboardException {
90   - String tbUserId = thirdService.login(thirdId);
91   - return buildJwtToken(tbUserId);
  84 + UserDTO userDto = thirdService.login(thirdId);
  85 + return buildJwtToken(userDto);
92 86 }
93 87
94 88 @NotNull
95   - private JwtTokenPair buildJwtToken(String tbUserId) {
96   - String accessToken="";
97   - String refreshToken="";
98   - if(StringUtils.isNotEmpty(tbUserId)){
99   - UserId userId = new UserId(UUID.fromString(tbUserId));
  89 + private JwtTokenPair buildJwtToken(UserDTO userDto) {
  90 + String accessToken = "";
  91 + String refreshToken = "";
  92 + if (userDto != null && StringUtils.isNotEmpty(userDto.getTbUser())) {
  93 + UserId userId = new UserId(UUID.fromString(userDto.getTbUser()));
100 94 User user = userService.findUserById(null, userId);
101 95 UserCredentials credentials = userService.findUserCredentialsByUserId(user.getTenantId(), userId);
102   - UserPrincipal principal = new UserPrincipal(UserPrincipal.Type.USER_NAME, user.getEmail());
  96 + String email = user.getEmail();
  97 + int emailIndex = email.indexOf("@");
  98 + UserPrincipal principal = new UserPrincipal(UserPrincipal.Type.USER_NAME, emailIndex > 0 ? email.substring(0, emailIndex) : email);
103 99 SecurityUser securityUser = new SecurityUser(user, credentials.isEnabled(), principal);
  100 + securityUser.setCurrentUserId(userDto.getId());
  101 + securityUser.setPlatformUserName(userDto.getUsername());
104 102 accessToken = tokenFactory.createAccessJwtToken(securityUser).getToken();
105 103 refreshToken = refreshTokenRepository.requestRefreshToken(securityUser).getToken();
106 104
... ...
... ... @@ -6,26 +6,18 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
6 6 import com.fasterxml.jackson.databind.JsonNode;
7 7 import lombok.RequiredArgsConstructor;
8 8 import lombok.extern.slf4j.Slf4j;
9   -import org.springframework.beans.factory.annotation.Autowired;
10 9 import org.springframework.security.authentication.BadCredentialsException;
11   -import org.springframework.security.authentication.InsufficientAuthenticationException;
12   -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
13 10 import org.springframework.security.core.userdetails.UsernameNotFoundException;
14 11 import org.springframework.security.crypto.password.PasswordEncoder;
15 12 import org.springframework.stereotype.Service;
16 13 import org.springframework.transaction.annotation.Transactional;
17 14 import org.thingsboard.server.common.data.StringUtils;
18   -import org.thingsboard.server.common.data.audit.ActionType;
19   -import org.thingsboard.server.common.data.id.EntityId;
20   -import org.thingsboard.server.common.data.id.TenantId;
21   -import org.thingsboard.server.common.data.id.UserId;
22   -import org.thingsboard.server.common.data.security.Authority;
23 15 import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils;
24 16 import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException;
25 17 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
26 18 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
  19 +import org.thingsboard.server.common.data.yunteng.dto.UserDTO;
27 20 import org.thingsboard.server.common.data.yunteng.dto.UserDetailsDTO;
28   -import org.thingsboard.server.common.data.yunteng.dto.YtOpinionDTO;
29 21 import org.thingsboard.server.common.data.yunteng.dto.YtThirdUserDTO;
30 22 import org.thingsboard.server.common.data.yunteng.dto.request.CodeTTL;
31 23 import org.thingsboard.server.common.data.yunteng.enums.MessageTypeEnum;
... ... @@ -33,17 +25,14 @@ import org.thingsboard.server.common.data.yunteng.enums.MsgTemplatePurposeEnum;
33 25 import org.thingsboard.server.common.data.yunteng.enums.ThirdPlatformEnum;
34 26 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
35 27 import org.thingsboard.server.dao.yunteng.entities.User;
36   -import org.thingsboard.server.dao.yunteng.entities.YtOpinionEntity;
37 28 import org.thingsboard.server.dao.yunteng.entities.YtThirdUserEntity;
38 29 import org.thingsboard.server.dao.yunteng.mapper.UserMapper;
39   -import org.thingsboard.server.dao.yunteng.mapper.YtOpinionMapper;
40 30 import org.thingsboard.server.dao.yunteng.mapper.YtThirdPlatformMapper;
41   -import org.thingsboard.server.dao.yunteng.service.*;
  31 +import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
  32 +import org.thingsboard.server.dao.yunteng.service.YtThirdPlatformService;
42 33
43   -import java.util.List;
44 34 import java.util.Objects;
45 35 import java.util.Optional;
46   -import java.util.UUID;
47 36
48 37 import static org.thingsboard.server.common.data.yunteng.constant.FastIotConstants.CacheConfigKey.MOBILE_LOGIN_SMS_CODE;
49 38 import static org.thingsboard.server.common.data.yunteng.constant.FastIotConstants.DEFAULT_DELIMITER;
... ... @@ -52,140 +41,143 @@ import static org.thingsboard.server.common.data.yunteng.constant.FastIotConstan
52 41 @Service
53 42 @RequiredArgsConstructor
54 43 public class YtThirdPlatformServiceImpl extends AbstractBaseService<YtThirdPlatformMapper, YtThirdUserEntity>
55   - implements YtThirdPlatformService {
56   -
57   - private final UserMapper userMapper;
58   - private final CacheUtils cacheUtils;
59   - private final PasswordEncoder passwordEncoder;
60   - @Override
61   - public YtPageData<YtThirdUserDTO> pageDatas(IPage<YtThirdUserEntity> pageInfrom, ThirdPlatformEnum platformName, String name) {
62   - Wrapper pageFilter = new QueryWrapper<YtThirdUserEntity>()
63   - .lambda()
64   - .eq(pageInfrom != null,YtThirdUserEntity::getPlatformName,platformName)
65   - .like(StringUtils.isNotEmpty(name),YtThirdUserEntity::getNickName,name);
66   - IPage<YtThirdUserEntity> page = baseMapper.selectPage(pageInfrom, pageFilter);
67   - return getPageData(page, YtThirdUserDTO.class);
68   - }
69   -
70   -
71   -
72   -
73   -
74   - @Override
75   - @Transactional(rollbackFor=Exception.class)
76   - public String saveOrUpdate(YtThirdUserDTO dto) {
77   - User user = null;
78   - switch (dto.getLoginMethod()){
79   - case PHONE:
80   - user = checkPhoneCode(dto.getAppUserKey(),dto.getAppUserSecret());
81   - break;
82   - case ACCOUNT:
83   - user = checkUsernamePassword(dto.getAppUserKey(),dto.getAppUserSecret());
84   - break;
  44 + implements YtThirdPlatformService {
  45 +
  46 + private final UserMapper userMapper;
  47 + private final CacheUtils cacheUtils;
  48 + private final PasswordEncoder passwordEncoder;
  49 +
  50 + @Override
  51 + public YtPageData<YtThirdUserDTO> pageDatas(IPage<YtThirdUserEntity> pageInfrom, ThirdPlatformEnum platformName, String name) {
  52 + Wrapper pageFilter = new QueryWrapper<YtThirdUserEntity>()
  53 + .lambda()
  54 + .eq(pageInfrom != null, YtThirdUserEntity::getPlatformName, platformName)
  55 + .like(StringUtils.isNotEmpty(name), YtThirdUserEntity::getNickName, name);
  56 + IPage<YtThirdUserEntity> page = baseMapper.selectPage(pageInfrom, pageFilter);
  57 + return getPageData(page, YtThirdUserDTO.class);
85 58 }
86   - if(user == null){
87   - throw new YtDataValidationException(ErrorMessage.USER_NOT_EXISTS.getMessage());
88   - }
89   - if(StringUtils.isEmpty(user.getAvatar()) && StringUtils.isNotEmpty(dto.getAvatarUrl())){
90   - user.setAvatar(dto.getAvatarUrl());
91   - userMapper.updateById(user);
92   - }
93   - Wrapper filter = new QueryWrapper<YtThirdUserEntity>().lambda()
94   - .eq(YtThirdUserEntity::getThirdUserId,dto.getThirdUserId());
95   - YtThirdUserEntity oldVideo = baseMapper.selectOne(filter);
96   - if (null == oldVideo) {
97   - baseMapper.insert(dto.getEntity(YtThirdUserEntity.class));
98   - }else {
99   - dto.setId(oldVideo.getId());
100   - baseMapper.updateById(dto.getEntity(YtThirdUserEntity.class));
101   - }
102   - return user.getTbUser();
103   - }
104   -
105   - /**
106   - * 验证用户名和密码有效性
107   - * @param key 用户名
108   - * @param secret 密码
109   - * @return
110   - */
111   - private User checkUsernamePassword(String key,String secret){
112   - Wrapper filter = new QueryWrapper<User>()
113   - .lambda()
114   - .eq(User::getUsername,key);
115   - User user = userMapper.selectOne(filter);
116   -
117   - if (user == null) {
118   - throw new UsernameNotFoundException("User not found: " + key);
119   - }
120   - if(!passwordEncoder.matches(secret, user.getPassword())){
121   - throw new BadCredentialsException("Authentication Failed. Username or Password not valid.");
122   - }
123   - return user;
124   - }
125   -
126   - /**
127   - * 验证手机号和验证码有效性
128   - * @param key 手机号
129   - * @param secret 验证码
130   - * @return
131   - */
132   - private User checkPhoneCode(String key,String secret){
133   - Wrapper filter = new QueryWrapper<User>()
134   - .lambda()
135   - .eq(User::getPhoneNumber,key);
136   - User users = userMapper.selectOne(filter);
137   - if (users == null) {
138   - throw new UsernameNotFoundException("phone number not found: " + key);
  59 +
  60 +
  61 + @Override
  62 + @Transactional(rollbackFor = Exception.class)
  63 + public UserDTO saveOrUpdate(YtThirdUserDTO dto) {
  64 + User user = null;
  65 + switch (dto.getLoginMethod()) {
  66 + case PHONE:
  67 + user = checkPhoneCode(dto.getAppUserKey(), dto.getAppUserSecret());
  68 + break;
  69 + case ACCOUNT:
  70 + user = checkUsernamePassword(dto.getAppUserKey(), dto.getAppUserSecret());
  71 + break;
  72 + }
  73 + if (user == null) {
  74 + throw new YtDataValidationException(ErrorMessage.USER_NOT_EXISTS.getMessage());
  75 + }
  76 + if (StringUtils.isEmpty(user.getAvatar()) && StringUtils.isNotEmpty(dto.getAvatarUrl())) {
  77 + user.setAvatar(dto.getAvatarUrl());
  78 + userMapper.updateById(user);
  79 + }
  80 + dto.setAppUserId(user.getId());
  81 +
  82 + Wrapper filter = new QueryWrapper<YtThirdUserEntity>().lambda()
  83 + .eq(YtThirdUserEntity::getThirdUserId, dto.getThirdUserId());
  84 + YtThirdUserEntity oldVideo = baseMapper.selectOne(filter);
  85 + if (null == oldVideo) {
  86 + baseMapper.insert(dto.getEntity(YtThirdUserEntity.class));
  87 + } else {
  88 + dto.setId(oldVideo.getId());
  89 + baseMapper.updateById(dto.getEntity(YtThirdUserEntity.class));
  90 + }
  91 + return user.getDTO(UserDTO.class);
139 92 }
140   - String cacheKey =
141   - MsgTemplatePurposeEnum.FOR_LOGIN.name()
142   - + DEFAULT_DELIMITER
143   - + MessageTypeEnum.PHONE_MESSAGE.name()
144   - + DEFAULT_DELIMITER
145   - + key;
146   -
147   - boolean correct =
148   - cacheUtils
149   - .get(MOBILE_LOGIN_SMS_CODE, cacheKey)
150   - .map(
151   - o -> {
152   - CodeTTL codeTTL = (CodeTTL) o;
153   - if (System.currentTimeMillis() - codeTTL.getSendTs() < 5 * 60 * 1000) {
154   - return Objects.equals(codeTTL.getCode(), secret);
155   - } else {
156   - return false;
157   - }
158   - })
159   - .orElse(false);
160   - Optional<UserDetailsDTO> optionalUser;
161   - if (!correct) {
162   - throw new BadCredentialsException("验证码不正确");
  93 +
  94 + /**
  95 + * 验证用户名和密码有效性
  96 + *
  97 + * @param key 用户名
  98 + * @param secret 密码
  99 + * @return
  100 + */
  101 + private User checkUsernamePassword(String key, String secret) {
  102 + Wrapper filter = new QueryWrapper<User>()
  103 + .lambda()
  104 + .eq(User::getUsername, key)
  105 + .or(query -> query.eq(User::getEmail, key));
  106 + User user = userMapper.selectOne(filter);
  107 +
  108 + if (user == null) {
  109 + throw new UsernameNotFoundException("User not found: " + key);
  110 + }
  111 + if (!passwordEncoder.matches(secret, user.getPassword())) {
  112 + throw new BadCredentialsException("Authentication Failed. Username or Password not valid.");
  113 + }
  114 + return user;
163 115 }
164   - return users;
165   - }
166 116
  117 + /**
  118 + * 验证手机号和验证码有效性
  119 + *
  120 + * @param key 手机号
  121 + * @param secret 验证码
  122 + * @return
  123 + */
  124 + private User checkPhoneCode(String key, String secret) {
  125 + Wrapper filter = new QueryWrapper<User>()
  126 + .lambda()
  127 + .eq(User::getPhoneNumber, key);
  128 + User users = userMapper.selectOne(filter);
  129 + if (users == null) {
  130 + throw new UsernameNotFoundException("phone number not found: " + key);
  131 + }
  132 + String cacheKey =
  133 + MsgTemplatePurposeEnum.FOR_LOGIN.name()
  134 + + DEFAULT_DELIMITER
  135 + + MessageTypeEnum.PHONE_MESSAGE.name()
  136 + + DEFAULT_DELIMITER
  137 + + key;
  138 +
  139 + boolean correct =
  140 + cacheUtils
  141 + .get(MOBILE_LOGIN_SMS_CODE, cacheKey)
  142 + .map(
  143 + o -> {
  144 + CodeTTL codeTTL = (CodeTTL) o;
  145 + if (System.currentTimeMillis() - codeTTL.getSendTs() < 5 * 60 * 1000) {
  146 + return Objects.equals(codeTTL.getCode(), secret);
  147 + } else {
  148 + return false;
  149 + }
  150 + })
  151 + .orElse(false);
  152 + Optional<UserDetailsDTO> optionalUser;
  153 + if (!correct) {
  154 + throw new BadCredentialsException("验证码不正确");
  155 + }
  156 + return users;
  157 + }
167 158
168 159
169   - @Override
170   - @Transactional(rollbackFor=Exception.class)
171   - public boolean deleteDataByIds(DeleteDTO deleteDTO) {
172   - Wrapper filter = new QueryWrapper<YtThirdUserEntity>().lambda()
173   - .in(YtThirdUserEntity::getId,deleteDTO.getIds());
174   - return baseMapper.delete(filter) > 0;
175   - }
  160 + @Override
  161 + @Transactional(rollbackFor = Exception.class)
  162 + public boolean deleteDataByIds(DeleteDTO deleteDTO) {
  163 + Wrapper filter = new QueryWrapper<YtThirdUserEntity>().lambda()
  164 + .in(YtThirdUserEntity::getId, deleteDTO.getIds());
  165 + return baseMapper.delete(filter) > 0;
  166 + }
176 167
177   - @Override
178   - public String login(String thirdUserId) {
179   - return baseMapper.login(thirdUserId);
180   - }
  168 + @Override
  169 + public UserDTO login(String thirdUserId) {
  170 + return baseMapper.login(thirdUserId)
  171 + .getDTO(UserDTO.class);
  172 + }
181 173
182   - @Override
183   - public String accessToken(String appKey, String appSecret) {
184   - return null;
185   - }
  174 + @Override
  175 + public String accessToken(String appKey, String appSecret) {
  176 + return null;
  177 + }
186 178
187   - @Override
188   - public JsonNode message(String receiver, JsonNode message) {
189   - return null;
190   - }
  179 + @Override
  180 + public JsonNode message(String receiver, JsonNode message) {
  181 + return null;
  182 + }
191 183 }
... ...
1 1 package org.thingsboard.server.dao.yunteng.mapper;
2 2
3 3 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4   -import com.baomidou.mybatisplus.core.metadata.IPage;
5 4 import org.apache.ibatis.annotations.Mapper;
6 5 import org.apache.ibatis.annotations.Param;
7   -import org.thingsboard.server.common.data.yunteng.dto.YtVideoDTO;
  6 +import org.thingsboard.server.dao.yunteng.entities.User;
8 7 import org.thingsboard.server.dao.yunteng.entities.YtThirdUserEntity;
9 8
10   -import java.util.List;
11   -
12 9 /**
13 10 * @author Administrator
14 11 */
... ... @@ -20,5 +17,5 @@ public interface YtThirdPlatformMapper extends BaseMapper<YtThirdUserEntity> {
20 17 * @param thirdId
21 18 * @return
22 19 */
23   - String login(@Param("thirdId") String thirdId);
  20 + User login(@Param("thirdId") String thirdId);
24 21 }
... ...
... ... @@ -3,34 +3,36 @@ package org.thingsboard.server.dao.yunteng.service;
3 3 import com.baomidou.mybatisplus.core.metadata.IPage;
4 4 import com.fasterxml.jackson.databind.JsonNode;
5 5 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
6   -import org.thingsboard.server.common.data.yunteng.dto.YtOpinionDTO;
  6 +import org.thingsboard.server.common.data.yunteng.dto.UserDTO;
7 7 import org.thingsboard.server.common.data.yunteng.dto.YtThirdUserDTO;
8 8 import org.thingsboard.server.common.data.yunteng.enums.ThirdPlatformEnum;
9 9 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
10   -import org.thingsboard.server.dao.yunteng.entities.YtOpinionEntity;
  10 +import org.thingsboard.server.dao.yunteng.entities.User;
11 11 import org.thingsboard.server.dao.yunteng.entities.YtThirdUserEntity;
12 12
13 13 /**
14 14 * 第三方平台用户管理相关接口
15 15 * 例如:微信小程序、钉钉等。
  16 + *
16 17 * @author Administrator
17 18 */
18 19 public interface YtThirdPlatformService extends BaseService<YtThirdUserEntity> {
19 20
20 21 /**
21   - * @param pageInfrom 分页配置信息
22   - * @param name 第三方平台用户昵称
  22 + * @param pageInfrom 分页配置信息
  23 + * @param name 第三方平台用户昵称
23 24 * @return
24 25 */
25   - YtPageData<YtThirdUserDTO> pageDatas(IPage<YtThirdUserEntity> pageInfrom, ThirdPlatformEnum platformName,String name);
  26 + YtPageData<YtThirdUserDTO> pageDatas(IPage<YtThirdUserEntity> pageInfrom, ThirdPlatformEnum platformName, String name);
26 27
27 28
28   -
29   - /** 第三方平台用户与系统用户绑定
  29 + /**
  30 + * 第三方平台用户与系统用户绑定
  31 + *
30 32 * @param dto
31 33 * @return
32 34 */
33   - String saveOrUpdate(YtThirdUserDTO dto);
  35 + UserDTO saveOrUpdate(YtThirdUserDTO dto);
34 36
35 37 /**
36 38 * @param deleteDTO
... ... @@ -40,16 +42,16 @@ public interface YtThirdPlatformService extends BaseService<YtThirdUserEntity> {
40 42
41 43 /**
42 44 * 第三方登录
  45 + *
43 46 * @param thirdUserId
44 47 * @return
45 48 */
46   - String login(String thirdUserId);
47   -
48   -
  49 + UserDTO login(String thirdUserId);
49 50
50 51
51 52 /**
52 53 * 访问令牌
  54 + *
53 55 * @param appKey
54 56 * @param appSecret
55 57 * @return
... ... @@ -58,10 +60,11 @@ public interface YtThirdPlatformService extends BaseService<YtThirdUserEntity> {
58 60
59 61 /**
60 62 * 推送第三方程序消息
  63 + *
61 64 * @param receiver
62 65 * @param message
63 66 * @return
64 67 */
65   - JsonNode message(String receiver,JsonNode message);
  68 + JsonNode message(String receiver, JsonNode message);
66 69
67 70 }
... ...
... ... @@ -3,8 +3,8 @@
3 3
4 4 <mapper namespace="org.thingsboard.server.dao.yunteng.mapper.YtThirdPlatformMapper">
5 5
6   - <select id="login" resultType="string">
7   - SELECT sus.tb_user
  6 + <select id="login" resultType="org.thingsboard.server.dao.yunteng.entities.User">
  7 + SELECT sus.*
8 8 FROM iotfs_third_user base
9 9 LEFT JOIN sys_user sus ON base.app_user_id = sus.id
10 10 <where>
... ...