Browse Source

add web login force

huodongdong 7 years ago
parent
commit
c27e8c256a

+ 1 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/assist/resolver/RequestHeaderResolver.java

@@ -30,6 +30,7 @@ public class RequestHeaderResolver implements HandlerMethodArgumentResolver {
             globalHeader.setEid(nativeWebRequest.getHeader("eid"));
             globalHeader.setSign(nativeWebRequest.getHeader("sign"));
             globalHeader.setRequestId(nativeWebRequest.getHeader("requestId"));
+            globalHeader.setTerminal(nativeWebRequest.getHeader("terminal"));
             return globalHeader;
         }
         return null;

+ 1 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/controller/LoginController.java

@@ -28,6 +28,7 @@ public class LoginController {
     public APIResult<UserInfoVo> login(HttpServletRequest request, @Valid @RequestBody LoginInfoDTO loginInfoDTO) {
         String ip = HttpUtil.getClientIp(request);
         loginInfoDTO.setIp(ip);
+        loginInfoDTO.setTerminal((String) request.getAttribute("terminal"));
         return userService.login(loginInfoDTO);
     }
 

+ 2 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/entity/GlobalHeader.java

@@ -16,4 +16,6 @@ public class GlobalHeader implements Serializable {
     private String sign;
 
     private String requestId;
+
+    private String terminal;
 }

+ 1 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/intercepter/RequestSignatureInterceptor.java

@@ -87,6 +87,7 @@ public class RequestSignatureInterceptor implements HandlerInterceptor {
             return false;
         }
 
+        request.setAttribute("terminal", headers.getTerminal());
         request.setAttribute("RANKIN_DEVICE_USER_INFO", du);
 //        if (true) {
 //            return true;

+ 37 - 7
rankin-api-web/src/main/java/cn/rankin/apiweb/service/user/UserService.java

@@ -3,6 +3,8 @@ package cn.rankin.apiweb.service.user;
 import cn.rankin.apiweb.code.ApiWebCode;
 import cn.rankin.apiweb.utils.SecurityManager;
 import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.model.BaseCode;
+import cn.rankin.common.utils.constant.PlatForm;
 import cn.rankin.common.utils.constant.RedisKey;
 import cn.rankin.common.utils.service.RedisService;
 import cn.rankin.data.api.app.dto.LoginInfoDTO;
@@ -30,6 +32,9 @@ public class UserService {
     @Value(value = "${token.expiration:604800}")
     private int expiration;
 
+    @Value(value = "${login.web.force.interval:2400}")
+    private int forceLoginInterval;
+
     @Autowired
     private UserClient userClient;
 
@@ -39,7 +44,7 @@ public class UserService {
     public APIResult<UserInfoVo> login(LoginInfoDTO loginInfoDTO) {
         String deviceCode = loginInfoDTO.getDeviceCode();
         String eid = loginInfoDTO.getEid();
-        String password = loginInfoDTO.getPassword();
+        String loginPassword = loginInfoDTO.getPassword();
         log.info("user login start, user={}", JSON.toJSONString(loginInfoDTO));
 
         APIResult<TerminalUserVo> userVoAPIResult = userClient.loadUserByEid(eid);
@@ -49,15 +54,34 @@ public class UserService {
             return APIResult.error(ApiWebCode.LOGIN_ERROR);
         }
 
-        String key = userVo.getPassword();
-        if (!SecurityManager.validate(password, key)) {
-            log.error("密码校验错误, password={}, key={}", password, key);
+        String storePassword = userVo.getPassword();
+        if (!SecurityManager.validate(loginPassword, storePassword)) {
+            log.error("密码校验错误, loginPassword={}, storePassword={}", loginPassword, storePassword);
             return APIResult.error(ApiWebCode.PASSWORD_ERROR);
         }
 
         String userId = userVo.getId();
         String ip = loginInfoDTO.getIp();
-        TerminalDeviceVo deviceVo = this.bind(userId, deviceCode, ip);
+        String terminal = loginInfoDTO.getTerminal();
+
+        // 网页端登陆在40分钟后可以踢掉对方网页登陆
+        if (PlatForm.WEB.equals(terminal)) {
+            String key = getUserFormatKey(userId);
+            DeviceUserVo deviceUserVo = (DeviceUserVo) redisService.get(key);
+            if (deviceUserVo != null ) {
+                Date refreshAt = deviceUserVo.getRefreshAt();
+                String lastTerminal = deviceUserVo.getTerminal();
+                if (DateUtils.addSeconds(refreshAt, forceLoginInterval).before(new Date()) && PlatForm.WEB.equals(lastTerminal)) {
+                    log.info("网页端强制登陆, deviceCode={}, eid={}", deviceCode, eid);
+                    APIResult<Boolean> forceLogoutResult = this.logout(userId);
+                    if (!forceLogoutResult.getSuccess()) {
+                        return APIResult.error(new BaseCode(forceLogoutResult.getCode(), forceLogoutResult.getMessage()));
+                    }
+                }
+            }
+        }
+
+        TerminalDeviceVo deviceVo = this.bind(userId, deviceCode, ip, terminal);
         if (deviceVo == null) {
             return APIResult.error(ApiWebCode.DEVICE_BOUND_ERROR);
         }
@@ -85,11 +109,12 @@ public class UserService {
         return APIResult.ok();
     }
 
-    public TerminalDeviceVo bind(String userId, String deviceCode, String ip) {
+    public TerminalDeviceVo bind(String userId, String deviceCode, String ip, String terminal) {
         TerminalDeviceDTO deviceDTO = new TerminalDeviceDTO();
         deviceDTO.setUserId(userId);
         deviceDTO.setDeviceCode(deviceCode);
         deviceDTO.setIp(ip);
+        deviceDTO.setTerminal(terminal);
         APIResult<TerminalDeviceVo> apiResult = userClient.deviceBind(deviceDTO);
         if (!apiResult.getSuccess()) {
             log.error("bind user api error");
@@ -104,6 +129,8 @@ public class UserService {
         DeviceUserVo deviceUserVo = (DeviceUserVo) redisService.get(key);
         if (deviceUserVo == null) {
             deviceUserVo = getDeviceUserVo(uid);
+        }
+        if (deviceUserVo != null) {
             this.save(deviceUserVo);
         }
         return deviceUserVo;
@@ -208,14 +235,17 @@ public class UserService {
         deviceUserVo.setMerchantName(userVo.getMerchantName());
         deviceUserVo.setMerchantContactName(userVo.getMerchantContactName());
         deviceUserVo.setMerchantContactMobile(userVo.getMerchantContactMobile());
+        deviceUserVo.setTerminal(deviceVo.getTerminal());
         refreshToken(deviceUserVo);
         return deviceUserVo;
     }
 
     public void refreshToken(DeviceUserVo deviceUserVo) {
         String token = SecurityManager.generateToken(deviceUserVo.getPassword());
-        Date expireAt = DateUtils.addSeconds(new Date(), this.expiration);
+        Date nowTime = new Date();
+        Date expireAt = DateUtils.addSeconds(nowTime, this.expiration);
         deviceUserVo.setToken(token);
         deviceUserVo.setExpireAt(expireAt);
+        deviceUserVo.setRefreshAt(nowTime);
     }
 }

+ 1 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/utils/RequestHeaderManager.java

@@ -11,6 +11,7 @@ public class RequestHeaderManager {
         globalHeader.setEid(request.getHeader("eid"));
         globalHeader.setSign(request.getHeader("sign"));
         globalHeader.setRequestId(request.getHeader("requestId"));
+        globalHeader.setTerminal(request.getHeader("terminal").toLowerCase());
         return globalHeader;
     }
 

+ 10 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/constant/PlatForm.java

@@ -0,0 +1,10 @@
+package cn.rankin.common.utils.constant;
+
+import java.io.Serializable;
+
+public class PlatForm implements Serializable{
+
+    public final static String TV = "tv";
+
+    public final static String WEB = "web";
+}

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/app/dto/LoginInfoDTO.java

@@ -20,4 +20,6 @@ public class LoginInfoDTO implements Serializable {
     private String password;
 
     private String ip;
+
+    private String terminal;
 }

+ 4 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/app/vo/DeviceUserVo.java

@@ -38,4 +38,8 @@ public class DeviceUserVo implements Serializable {
 
     private Date expireAt;
 
+    private Date refreshAt;
+
+    private String terminal;
+
 }

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/user/dto/TerminalDeviceDTO.java

@@ -24,5 +24,7 @@ public class TerminalDeviceDTO {
 
     private String modelNo;
 
+    private String terminal;
+
     private BaseStatusEnum status = BaseStatusEnum.NORMAL;
 }

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/user/entity/TerminalDevice.java

@@ -42,6 +42,8 @@ public class TerminalDevice implements Serializable {
 	@Column(name="model_no")
 	private String modelNo;
 
+	private String terminal;
+
 	@Enumerated(EnumType.ORDINAL)
 	private BaseStatusEnum status = BaseStatusEnum.NORMAL;
 

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/user/entity/TerminalDeviceBindLog.java

@@ -45,4 +45,6 @@ public class TerminalDeviceBindLog implements Serializable {
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtModified;
 
+    private String terminal;
+
 }

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/user/vo/TerminalDeviceVo.java

@@ -28,4 +28,6 @@ public class TerminalDeviceVo implements Serializable {
 
     private Date gmtModified;
 
+    private String terminal;
+
 }

+ 2 - 1
rankin-user-service/src/main/java/cn/rankin/userservice/service/TerminalDeviceBindLogService.java

@@ -14,13 +14,14 @@ public class TerminalDeviceBindLogService {
     private TerminalDeviceBindLogRepository terminalDeviceBindLogRepository;
 
     @Transactional
-    public TerminalDeviceBindLog insert(String deviceCode, String userId, String brand, String ip, String modelNo) {
+    public TerminalDeviceBindLog insert(String deviceCode, String userId, String brand, String ip, String modelNo, String terminal) {
         TerminalDeviceBindLog deviceBindLog = new TerminalDeviceBindLog();
         deviceBindLog.setDeviceCode(deviceCode);
         deviceBindLog.setUserId(userId);
         deviceBindLog.setBrand(brand);
         deviceBindLog.setId(ip);
         deviceBindLog.setModelNo(modelNo);
+        deviceBindLog.setTerminal(terminal);
         return terminalDeviceBindLogRepository.save(deviceBindLog);
     }
 }

+ 3 - 1
rankin-user-service/src/main/java/cn/rankin/userservice/service/TerminalDeviceService.java

@@ -26,6 +26,7 @@ public class TerminalDeviceService {
         String brand = terminalDeviceDTO.getBrand();
         String ip = terminalDeviceDTO.getIp();
         String modelNo = terminalDeviceDTO.getModelNo();
+        String terminal = terminalDeviceDTO.getTerminal();
 
         TerminalDevice terminalDevice = terminalDeviceRepository.findByDeviceCodeOrUserId(deviceCode, userId);
         if (terminalDevice != null) {
@@ -42,9 +43,10 @@ public class TerminalDeviceService {
         terminalDevice.setBrand(brand);
         terminalDevice.setModelNo(modelNo);
         terminalDevice.setIp(ip);
+        terminalDevice.setTerminal(terminal);
 
         TerminalDevice deviceBind = terminalDeviceRepository.save(terminalDevice);
-        terminalDeviceBindLogService.insert(deviceCode, userId, brand, ip, modelNo);
+        terminalDeviceBindLogService.insert(deviceCode, userId, brand, ip, modelNo, terminal);
 
         return APIResult.ok(deviceBind);
     }