Procházet zdrojové kódy

登录 校验登录接口功能开发完成

wuxw7 před 7 roky
rodič
revize
fcdbeb03fe

+ 1 - 0
Api/src/main/java/com/java110/api/listener/AbstractServiceApiDataFlowListener.java

@@ -197,6 +197,7 @@ public abstract class AbstractServiceApiDataFlowListener implements ServiceDataF
 
     }
 
+
     public RestTemplate getRestTemplate() {
         return restTemplate;
     }

+ 109 - 0
Api/src/main/java/com/java110/api/listener/CheckLoginServiceListener.java

@@ -0,0 +1,109 @@
+package com.java110.api.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.common.constant.CommonConstant;
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.constant.ServiceCodeConstant;
+import com.java110.common.exception.SMOException;
+import com.java110.common.util.Assert;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.factory.AuthenticationFactory;
+import com.java110.entity.center.AppService;
+import com.java110.event.service.api.ServiceDataFlowEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import javax.naming.AuthenticationException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 用户注册 侦听
+ * Created by wuxw on 2018/5/18.
+ */
+@Java110Listener("checkLoginServiceListener")
+public class CheckLoginServiceListener extends AbstractServiceApiDataFlowListener{
+
+    private final static Logger logger = LoggerFactory.getLogger(CheckLoginServiceListener.class);
+
+
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodeConstant.SERVICE_CODE_CHECK_SERVICE_LOGIN;
+    }
+
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+
+
+    /**
+     * 请求参数格式:
+     * {
+     "userId": "-1",
+     "name": "张三",
+     "email": "928255095@qq.com",
+     "address": "青海省西宁市城中区129号",
+     "password": "ERCBHDUYFJDNDHDJDNDJDHDUDHDJDDKDK",
+     "locationCd": "001",
+     "age": 19,
+     "sex": "0",
+     "tel": "17797173943",
+     "level_cd": "1",
+     "businessUserAttr": [{
+     "attrId":"-1",
+     "specCd":"1001",
+     "value":"01"
+     }]
+     }
+     * @param event
+     */
+    @Override
+    public void soService(ServiceDataFlowEvent event) {
+        //获取数据上下文对象
+        DataFlowContext dataFlowContext = event.getDataFlowContext();
+        AppService service = event.getAppService();
+        String paramIn = dataFlowContext.getReqData();
+        Assert.isJsonObject(paramIn,"用户注册请求参数有误,不是有效的json格式 "+paramIn);
+        Assert.jsonObjectHaveKey(paramIn,"token","请求报文中未包含token 节点请检查");
+        JSONObject paramObj = JSONObject.parseObject(paramIn);
+        ResponseEntity responseEntity= null;
+        try {
+            Map<String, String> claims = AuthenticationFactory.verifyToken(paramObj.getString("token"));
+            if(claims == null || claims.isEmpty()){
+                throw new AuthenticationException("人证失败,从token中解析到信息为空");
+            }
+            responseEntity = new ResponseEntity<String>(JSONObject.toJSONString(claims), HttpStatus.OK);
+        } catch (Exception e) {
+            //Invalid signature/claims
+            responseEntity = new ResponseEntity<String>("人证失败,不是有效的token", HttpStatus.UNAUTHORIZED);
+        }
+        dataFlowContext.setResponseEntity(responseEntity);
+    }
+
+    /**
+     * 对请求报文处理
+     * @param paramIn
+     * @return
+     */
+    private JSONObject refreshParamIn(String paramIn){
+        JSONObject paramObj = JSONObject.parseObject(paramIn);
+        paramObj.put("userId","-1");
+        paramObj.put("levelCd","0");
+
+        return paramObj;
+    }
+
+
+
+
+
+}

+ 135 - 0
Api/src/main/java/com/java110/api/listener/UserLoginServiceListener.java

@@ -0,0 +1,135 @@
+package com.java110.api.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.common.constant.CommonConstant;
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.constant.ServiceCodeConstant;
+import com.java110.common.exception.SMOException;
+import com.java110.common.util.Assert;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.factory.AuthenticationFactory;
+import com.java110.core.factory.DataFlowFactory;
+import com.java110.entity.center.AppService;
+import com.java110.event.service.api.ServiceDataFlowEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.*;
+import org.springframework.web.client.HttpStatusCodeException;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 用户注册 侦听
+ * Created by wuxw on 2018/5/18.
+ */
+@Java110Listener("userLoginServiceListener")
+public class UserLoginServiceListener extends AbstractServiceApiDataFlowListener{
+
+    private final static Logger logger = LoggerFactory.getLogger(UserLoginServiceListener.class);
+
+
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodeConstant.SERVICE_CODE_USER_SERVICE_LOGIN;
+    }
+
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+
+
+    /**
+     * 请求参数格式:
+     * {
+        "username":"admin",
+        "passwd":"1234565"
+     }
+     返回报文:
+     {
+        "userId":"",
+        "token":"12dddd"
+     }
+     * @param event
+     */
+    @Override
+    public void soService(ServiceDataFlowEvent event) {
+        //获取数据上下文对象
+        DataFlowContext dataFlowContext = event.getDataFlowContext();
+        AppService service = event.getAppService();
+        String paramIn = dataFlowContext.getReqData();
+        Assert.isJsonObject(paramIn,"用户注册请求参数有误,不是有效的json格式 "+paramIn);
+        Assert.jsonObjectHaveKey(paramIn,"username","用户登录,未包含username节点,请检查" + paramIn);
+        Assert.jsonObjectHaveKey(paramIn,"passwd","用户登录,未包含passwd节点,请检查" + paramIn);
+        RestTemplate restTemplate = super.getRestTemplate();
+        ResponseEntity responseEntity= null;
+        JSONObject paramInJson = JSONObject.parseObject(paramIn);
+        //根据AppId 查询 是否有登录的服务,查询登录地址调用
+        AppService appService = DataFlowFactory.getService(dataFlowContext.getAppId(), ServiceCodeConstant.SERVICE_CODE_QUERY_USER_LOGIN);
+        String requestUrl = appService.getUrl() + "?userCode="+paramInJson.getString("username");
+        HttpEntity<String> httpEntity = new HttpEntity<String>("", new HttpHeaders());
+        try{
+            responseEntity = restTemplate.exchange(requestUrl, HttpMethod.GET, httpEntity, String.class);
+        }catch (HttpStatusCodeException e){ //这里spring 框架 在4XX 或 5XX 时抛出 HttpServerErrorException 异常,需要重新封装一下
+            responseEntity = new ResponseEntity<String>("请求登录查询异常,"+e.getResponseBodyAsString(),e.getStatusCode());
+            dataFlowContext.setResponseEntity(responseEntity);
+            return ;
+        }
+
+        String resultBody = responseEntity.getBody().toString();
+
+        Assert.isJsonObject(resultBody,"调用登录查询异常,返回报文有误,不是有效的json格式 "+resultBody);
+
+        JSONObject resultInfo = JSONObject.parseObject(resultBody);
+        if(!resultInfo.containsKey("user") || !resultInfo.getJSONObject("user").containsKey("userPwd")
+                || !resultInfo.getJSONObject("user").containsKey("userId")){
+            responseEntity = new ResponseEntity<String>("用户或密码错误", HttpStatus.UNAUTHORIZED);
+            dataFlowContext.setResponseEntity(responseEntity);
+            return ;
+        }
+
+        JSONObject userInfo = resultInfo.getJSONObject("user");
+        String userPwd = userInfo.getString("userPwd");
+        if(!userPwd.equals(paramInJson.getString("passwd"))){
+            responseEntity = new ResponseEntity<String>("密码错误", HttpStatus.UNAUTHORIZED);
+            dataFlowContext.setResponseEntity(responseEntity);
+            return ;
+        }
+
+        try {
+            Map userMap = new HashMap();
+            userMap.put(CommonConstant.LOGIN_USER_ID,userInfo.getString("userId"));
+            String token = AuthenticationFactory.createAndSaveToken(userMap);
+            userInfo.remove("userPwd");
+            userInfo.put("token",token);
+            responseEntity = new ResponseEntity<String>(userInfo.toJSONString(), HttpStatus.OK);
+            dataFlowContext.setResponseEntity(responseEntity);
+        }catch (Exception e){
+            logger.error("登录异常:",e);
+            throw new SMOException(ResponseConstant.RESULT_CODE_INNER_ERROR,"系统内部错误,请联系管理员");
+        }
+    }
+
+    /**
+     * 对请求报文处理
+     * @param paramIn
+     * @return
+     */
+    private JSONObject refreshParamIn(String paramIn){
+        JSONObject paramObj = JSONObject.parseObject(paramIn);
+        paramObj.put("userId","-1");
+        paramObj.put("levelCd","0");
+
+        return paramObj;
+    }
+
+
+
+
+
+}

+ 10 - 0
java110-common/src/main/java/com/java110/common/constant/ServiceCodeConstant.java

@@ -173,6 +173,16 @@ public class ServiceCodeConstant {
      */
     public static final String SERVICE_CODE_USER_SERVICE_REGISTER = "user.service.register";
 
+    /**
+     * 用户登录服务处理
+     */
+    public static final String SERVICE_CODE_USER_SERVICE_LOGIN = "user.service.login";
+
+    /**
+     * 检查用户登录服务处理
+     */
+    public static final String SERVICE_CODE_CHECK_SERVICE_LOGIN = "check.service.login";
+
 
 
 }

+ 1 - 1
java110-config/db/CenterService/create_table.db

@@ -5,7 +5,7 @@ create database TT;
 CREATE TABLE c_orders(
     o_id VARCHAR(30) NOT NULL UNIQUE COMMENT '订单ID',
     app_id VARCHAR(10) NOT NULL COMMENT '应用ID',
-    ext_transaction_id VARCHAR(32) NOT NULL COMMENT '外部交易流水',
+    ext_transaction_id VARCHAR(36) NOT NULL COMMENT '外部交易流水',
     user_id VARCHAR(30) NOT NULL COMMENT '用户ID',
     request_time VARCHAR(16) NOT NULL COMMENT '外部系统请求时间',
     create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

+ 1 - 1
java110-config/db/LogService/create_table.db

@@ -2,7 +2,7 @@
 
 create table l_transaction_log(
     log_id varchar(30) not null  COMMENT 'id',
-    transaction_id VARCHAR(32) NOT NULL COMMENT '外部交易流水',
+    transaction_id VARCHAR(36) NOT NULL COMMENT '外部交易流水',
     contract_id varchar(64) not null comment '上下文ID',
     ip varchar(20) not null comment '日志产生主机IP',
     port varchar(10) not null comment '日志产生端口',

+ 3 - 0
java110-core/src/main/java/com/java110/core/context/DataFlowContext.java

@@ -21,6 +21,9 @@ public interface DataFlowContext {
      */
     public String getReqData();
 
+    //AppId
+    public String getAppId();
+
     public JSONObject getReqJson();
     /**
      * 返回报文

+ 32 - 0
java110-core/src/main/java/com/java110/core/factory/DataFlowFactory.java

@@ -2,6 +2,7 @@ package com.java110.core.factory;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.java110.common.cache.AppRouteCache;
 import com.java110.common.cache.MappingCache;
 import com.java110.common.constant.CommonConstant;
 import com.java110.common.constant.MappingConstant;
@@ -123,6 +124,23 @@ public class DataFlowFactory {
         }
         return null;
     }
+
+    /**
+     * 根据AppId 和serviceCode 查询AppRoute
+     * @param appId
+     * @param serviceCode
+     * @return
+     */
+    public static AppRoute getRoute(String appId,String serviceCode){
+        List<AppRoute> appRoutes = AppRouteCache.getAppRoute(appId);
+        for(AppRoute appRoute : appRoutes) {
+            if (StatusConstant.STATUS_CD_VALID.equals(appRoute.getStatusCd())
+                    &&appRoute.getAppService().getServiceCode().equals(serviceCode)){
+                return appRoute;
+            }
+        }
+        return null;
+    }
     /**
      * 获取单个服务
      * @param dataFlow
@@ -151,6 +169,20 @@ public class DataFlowFactory {
         return route.getAppService();
     }
 
+    /**
+     * 根据appid 和 serviceCode 查询相应的 appservice
+     * @param appId
+     * @param serviceCode
+     * @return
+     */
+    public static AppService getService(String appId,String serviceCode){
+        AppRoute route = getRoute(appId, serviceCode);
+        if(route == null){
+            return null;
+        }
+        return route.getAppService();
+    }
+
     /**
      * 获取Order信息
      * @param dataFlow