Browse Source

BUG修复

yingp 6 years ago
parent
commit
d8de4ee4a3

+ 2 - 2
runtime/mobile-grpc-server/src/test/java/com/usoftchina/uu/mobile/grpc/test/MobileAccountServiceTest.java

@@ -96,9 +96,9 @@ public class MobileAccountServiceTest extends AbstractGRpcServerTest {
 
     @Test
     public void testC_switchCompany() {
-
+        Authentication.set("IivkR1tkBV4Ev4Qhmb0BoFMfZHh92E3y");
         SwitchCompanyRequest request = SwitchCompanyRequest.newBuilder()
-                .setCompanyId(100001).build();
+                .setCompanyId(10050540).build();
         try {
             SwitchCompanyResponse response = accountServiceBlockingStub.switchCompany(request);
             ResponseHeader header = response.getResponseHeader();

+ 3 - 3
services/account-service/src/main/java/com/usoftchina/uu/account/service/impl/AccountServiceImpl.java

@@ -59,7 +59,7 @@ public class AccountServiceImpl implements AccountApi {
                 if (null != localExists) {
                     ExceptionCode.USER_MOBILE_EXIST.occur();
                 } else {
-                    boolean isNew = ssoRegisterAccount(accountDTO, password);
+                    boolean isNew = registerOrMergeFromSso(accountDTO, password);
                     insert(accountDTO);
                     if (!isNew) {
                         // 这里是因为账户中心已存在该账户,所以抛出异常
@@ -85,7 +85,7 @@ public class AccountServiceImpl implements AccountApi {
                     accountDTO.setId(localExists.getId());
                     return updateByPrimaryKey(accountDTO);
                 } else {
-                    ssoRegisterAccount(accountDTO, password);
+                    registerOrMergeFromSso(accountDTO, password);
                     return insert(accountDTO);
                 }
             }
@@ -112,7 +112,7 @@ public class AccountServiceImpl implements AccountApi {
      * @param accountDTO
      * @return 新注册到账户中心 true,账户中心已存在账户 false
      */
-    private boolean ssoRegisterAccount(AccountDTO accountDTO, String password) {
+    private boolean registerOrMergeFromSso(AccountDTO accountDTO, String password) {
         SsoResult<SsoUser> result = ssoUserApi.getUserByMobile(accountDTO.getMobile());
         if (result.isSuccess()) {
             SsoUser user = result.getContent();

+ 1 - 1
services/account-service/src/main/java/com/usoftchina/uu/account/service/impl/CompanyServiceImpl.java

@@ -80,7 +80,7 @@ public class CompanyServiceImpl implements CompanyApi {
         if (CollectionUtils.isEmpty(companyList)) {
             // 如果没有企业信息,从账户中心获取
             companyList = getFromSsoByAccountId(accountId);
-            if (CollectionUtils.isEmpty(companyList)) {
+            if (!CollectionUtils.isEmpty(companyList)) {
                 companyList.forEach(company -> {
                     saveOrUpdateByPrimaryKey(company);
                     accountApi.bindCompany(accountId, company.getId());

+ 3 - 2
services/account-service/src/main/java/com/usoftchina/uu/account/service/impl/TokenServiceImpl.java

@@ -5,6 +5,7 @@ import com.usoftchina.uu.account.dto.TokenDTO;
 import com.usoftchina.uu.util.GsonUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.time.Duration;
@@ -17,11 +18,11 @@ import java.time.Duration;
 public class TokenServiceImpl implements TokenApi {
 
     @Autowired
-    private RedisTemplate redisTemplate;
+    private StringRedisTemplate redisTemplate;
 
     @Override
     public TokenDTO findByPrimaryKey(String id) {
-        Object json = redisTemplate.opsForValue().get(id);
+        String json = redisTemplate.opsForValue().get(id);
         if (null != json) {
             return GsonUtils.fromJson(json.toString(), TokenDTO.class);
         }

+ 23 - 21
services/mobile-grpc-service/src/main/java/com/usoftchina/uu/mobile/grpc/interceptor/MobileAuthenticationInterceptor.java

@@ -64,28 +64,30 @@ public class MobileAuthenticationInterceptor implements ServerInterceptor {
         if (headers.containsKey(AUTH_HEADER_KEY)) {
             TokenDTO tokenDTO = tokenApi.findByPrimaryKey(headers.get(AUTH_HEADER_KEY));
             if (null != tokenDTO) {
-                try {
-                    // token信息放在当前线程
-                    TokenHolder.set(tokenDTO);
-                    // 用户信息放在当前线程
-                    AccountDTO accountDTO = accountApi.findByPrimaryKey(tokenDTO.getAccountId());
-                    AccountHolder.set(accountDTO);
-                    // 企业信息放在当前线程
-                    if (null != tokenDTO.getCompanyId()) {
-                        CompanyDTO companyDTO = companyApi.findByPrimaryKey(tokenDTO.getCompanyId());
-                        CompanyHolder.set(companyDTO);
-                    }
-                    // 设备信息放在当前线程
-                    DeviceInfoDTO deviceInfoDTO = deviceInfoApi.findByAccountId(tokenDTO.getAccountId());
-                    DeviceInfoHolder.set(deviceInfoDTO);
-
-                    return next.startCall(call, headers);
-                } finally {
-                    TokenHolder.clear();
-                    AccountHolder.clear();
-                    CompanyHolder.clear();
-                    DeviceInfoHolder.clear();
+                // token信息放在当前线程
+                TokenHolder.set(tokenDTO);
+                // 用户信息放在当前线程
+                AccountDTO accountDTO = accountApi.findByPrimaryKey(tokenDTO.getAccountId());
+                AccountHolder.set(accountDTO);
+                // 企业信息放在当前线程
+                if (null != tokenDTO.getCompanyId()) {
+                    CompanyDTO companyDTO = companyApi.findByPrimaryKey(tokenDTO.getCompanyId());
+                    CompanyHolder.set(companyDTO);
                 }
+                // 设备信息放在当前线程
+                DeviceInfoDTO deviceInfoDTO = deviceInfoApi.findByAccountId(tokenDTO.getAccountId());
+                DeviceInfoHolder.set(deviceInfoDTO);
+
+                return next.startCall(new ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(call) {
+                    @Override
+                    public void close(Status status, Metadata trailers) {
+                        super.close(status, trailers);
+                        TokenHolder.clear();
+                        AccountHolder.clear();
+                        CompanyHolder.clear();
+                        DeviceInfoHolder.clear();
+                    }
+                }, headers);
             } else {
                 logger.error("Authentication Expired On Call {}", method);
                 call.close(Status.UNAUTHENTICATED.withDescription("会话过期,请重新登录"), headers);