浏览代码

代理登录

lyhzzz 3 年之前
父节点
当前提交
62a046e7b2

+ 32 - 4
4dkankan-center-platform/src/main/java/com/fdkankan/agent/controller/AgentLoginController.java

@@ -3,25 +3,53 @@ package com.fdkankan.agent.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.agent.request.RequestAgent;
 import com.fdkankan.agent.service.IAgentService;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.JwtUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 代理商登录模块
  */
 @RestController
 @RequestMapping("/api/sso/agent")
-public class AgentLoginController {
+public class AgentLoginController  {
 
     @Autowired
     private IAgentService agentService;
+    @Resource
+    private RedisTemplate<String,String> redisTemplate;
 
+    /**
+     * 代理商登录
+     */
     @PostMapping(value = "/login")
-    public String AgentLogin(@RequestBody RequestAgent requestAgent){
-        JSONObject obj = agentService.login(requestAgent);
-        return "";
+    public JSONObject AgentLogin(@RequestBody RequestAgent requestAgent){
+        return agentService.login(requestAgent);
+    }
+
+    /**
+     * 代理商登出
+     */
+    @PostMapping(value = "/logout")
+    public String logout(HttpServletRequest request) {
+        String token = request.getHeader("token");
+        if(token == null){
+            throw new BusinessException(ErrorCode.USER_NOT_LOGIN);
+        }
+        String userName = JwtUtil.getUsername(token);
+        if(userName == null){
+            throw new BusinessException(ErrorCode.TOKEN_ILLEGAL);
+        }
+        redisTemplate.delete(userName);
+        return "登出成功";
     }
 }

+ 5 - 0
4dkankan-center-platform/src/main/java/com/fdkankan/agent/service/IAgentService.java

@@ -15,5 +15,10 @@ import com.fdkankan.agent.request.RequestAgent;
  */
 public interface IAgentService extends IService<Agent> {
 
+    /**
+     * 代理商登录
+     * @param requestAgent 代理商id 密码
+     * @return token
+     */
     JSONObject login(RequestAgent requestAgent);
 }

+ 30 - 4
4dkankan-center-platform/src/main/java/com/fdkankan/agent/service/impl/AgentServiceImpl.java

@@ -9,8 +9,15 @@ import com.fdkankan.agent.request.RequestAgent;
 import com.fdkankan.agent.service.IAgentService;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.common.util.PasswordUtils;
+import com.fdkankan.common.util.SsoUtil;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+
 /**
  * <p>
  * 代理商表 服务实现类
@@ -22,14 +29,33 @@ import org.springframework.stereotype.Service;
 @Service
 public class AgentServiceImpl extends ServiceImpl<IAgentMapper, Agent> implements IAgentService {
 
+    @Resource
+    private  RedisTemplate<String,String> redisTemplate;
+
     @Override
-    public JSONObject login(RequestAgent requestAgent) {
+    public JSONObject login(RequestAgent param) {
+        if(param.getAgentId() == null || param.getAgentPassword() == null){
+            throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
+        }
+
         QueryWrapper<Agent> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("agent_id",requestAgent.getAgentId());
+        queryWrapper.eq("agent_id",param.getAgentId());
+        queryWrapper.eq("rec_status","A");
         Agent agent = this.getOne(queryWrapper);
         if(agent == null){
-            throw new BusinessException(ErrorCode.FAILURE_CODE_3011);
+            throw new BusinessException(ErrorCode.USER_NOT_EXIST);
+        }
+        String encryptPwd = PasswordUtils.encrypt(param.getAgentId(), param.getAgentPassword(), PasswordUtils.getStaticSalt());
+        if (!encryptPwd.equals(agent.getAgentPassword())){
+            throw new BusinessException(ErrorCode.PASSWORD_ERROR);
         }
-        return null;
+        String key = SsoUtil.PREFIX_CACHE_AGENT + agent.getAgentId();
+        redisTemplate.delete(key);
+        String token = JwtUtil.createJWT(-1, key,"agent");
+        redisTemplate.opsForValue().set(key,token,21600, TimeUnit.SECONDS);
+        JSONObject obj = new JSONObject();
+        obj.put("token", token);
+        return obj;
     }
+
 }

+ 0 - 67
4dkankan-center-platform/src/main/resources/application.yml

@@ -1,67 +0,0 @@
-server:
-  port: 8084
-  servlet:
-    context-path: /platform
-  tomcat:
-    accesslog:
-      buffered: true
-      directory: /home/logs/tomcat
-      enabled: true
-      file-date-format: .yyyy-MM-dd
-      pattern: '%t | %{X-Real-IP}i | %b | %B | %H | %l | %m | %p | %q | %r | %s | %S | %u | %U | %v | %D | %T | %{Cookie}i | %{User-Agent}i | %{a}r'
-      prefix: access_log
-      rename-on-rotate: false
-      request-attributes-enabled: false
-      rotate: true
-      suffix: .log
-spring:
-  cloud:
-    nacos:
-      discovery:
-        port: ${discoveryPort:8848}
-        server-addr: 192.168.0.47
-  application:
-    name: 4dkankan-center-platform
-  datasource:
-    name: test
-    url: jdbc:mysql://localhost:3306/4dkankan_center_application?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&allowMultiQueries=true
-    username: root
-    password: 123456
-    type: com.alibaba.druid.pool.DruidDataSource
-    driver-class-name: com.mysql.cj.jdbc.Driver
-mybatis:
-  mapper-locations: classpath:mapper/*/*.xml
-  type-aliases-package: com.4dkankan_center_application.www
-  configuration:
-    map-underscore-to-camel-case: true
-logging:
-  config: classpath:logback-spring.xml
-
-prefix:
-  ali: https://4dkk.4dage.com/
-
-oss:
-  point: http://oss-cn-shenzhen-internal.aliyuncs.com
-  key: LTAIUrvuHqj8pvry
-  secrey: JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
-  bucket: 4dkankan
-  type: oss
-  s3key: AKIAWCV5QFZ3ZNELKYUY
-  s3secrey: epS5ghyR4LJ7rxk/qJO9ZYh6m9Oz6g5haKDu4yws
-  s3bucket: 4dkankan
-
-
-rocketmq:
-  name-srv-addr: 192.168.0.47:9876 #集群地址,多个;隔开
-  producer:
-    group:
-      testGrop: test_grop
-    sendMsgTimeout: 5000  #发送超时配置毫秒数, 可选s, 默认3000
-    retryTimesWhenSendFailed: 15 #发送消息失败之后重试次数
-    maxMessageSize: 4194304  #消息最大长度,默认1024*1024*4(4M)
-  consumer:
-    testGrop: test_grop
-  topic:
-    testGrop: test_grop
-  tag:
-    testGrop: test

+ 24 - 0
4dkankan-center-platform/src/main/resources/bootstrap.yml

@@ -0,0 +1,24 @@
+spring:
+  application:
+    name: 4dkankan-center-platform
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: 4dkankan-center-platform.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-mq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: 4dkankan-dev

+ 2 - 2
4dkankan-center-platform/src/main/resources/logback-spring.xml

@@ -143,7 +143,7 @@
 			<onMismatch>DENY</onMismatch>
 		</filter>
 	</appender>
-	
+
 	<appender name="PROGRAM_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<!-- 正在记录的日志文件的路径及文件名 -->
 		<file>${log.path}/program/log_program.log</file>
@@ -200,7 +200,7 @@
         <appender-ref ref="VISIT_FILE"/>
     </logger>
 
-	<!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, 
+	<!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE,
 		DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。 addtivity:是否向上级logger传递打印信息。默认是true。 -->
 	<!--<logger name="org.springframework.web" level="info"/> -->
 	<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> -->

+ 6 - 0
4dkankan-common/src/main/java/com/fdkankan/common/constant/ErrorCode.java

@@ -10,6 +10,12 @@ public enum ErrorCode {
     TOKEN_ILLEGAL(4002, "token不合法"),
     TOKEN_NOT_FOUND(4003, "用户未登录"),
     APP_ID_ILLEGAL(4004 , "非法的APP ID"),
+    USER_NOT_EXIST(4005,"用户不存在"),
+    PASSWORD_ERROR(4006,"密码错误"),
+    MISSING_REQUIRED_PARAMETERS(4007,"缺少必要参数"),
+    USER_NOT_LOGIN(4008, "用户未登录"),
+
+
 
     FAILURE_CODE_3001(3001, "缺少必要参数"),
     FAILURE_CODE_3002(3002, "访问异常!"),

+ 29 - 0
4dkankan-common/src/main/java/com/fdkankan/common/controller/BaseController.java

@@ -0,0 +1,29 @@
+package com.fdkankan.common.controller;
+
+import com.fdkankan.common.util.DateEditor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.propertyeditors.StringTrimmerEditor;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+
+public class BaseController {
+    @Autowired
+    protected HttpServletRequest request;
+
+    @Autowired
+    protected HttpServletResponse response;
+
+    @InitBinder
+    protected void initBinder(WebDataBinder webDataBinder) {
+        webDataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
+        webDataBinder.registerCustomEditor(Date.class, new DateEditor(true));
+    }
+
+    protected String getToken(){
+        return request.getHeader("token");
+    }
+}

+ 5 - 4
4dkankan-common/src/main/java/com/fdkankan/common/response/BaseResponseAdvice.java

@@ -1,7 +1,7 @@
 package com.fdkankan.common.response;
 
 
-import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.core.MethodParameter;
 import org.springframework.http.MediaType;
 import org.springframework.http.converter.HttpMessageConverter;
@@ -20,12 +20,13 @@ public class BaseResponseAdvice implements ResponseBodyAdvice<Object> {
     @Override
     public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
         System.out.println("响应拦截成功");
+        if(body instanceof String){
+            return JSONObject.toJSONString(ResultData.ok(body));
+        }
         if (body instanceof ResultData) {
             return body;
-        } else if (body == null) {
-            return JSON.toJSONString(ResultData.ok());
         } else {
-            return JSON.toJSONString( ResultData.ok(body));
+            return ResultData.ok(body);
         }
     }
 }

+ 46 - 0
4dkankan-common/src/main/java/com/fdkankan/common/util/DateEditor.java

@@ -0,0 +1,46 @@
+package com.fdkankan.common.util;
+
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.beans.PropertyEditorSupport;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateEditor extends PropertyEditorSupport {
+
+    private boolean emptyAsNull;
+    private String dateFormat = "yyyy-MM-dd HH:mm:ss";
+    public static final String[] DATE_PATTERNS = {"yyyy", "yyyy-MM", "yyyyMM", "yyyy/MM", "yyyy-MM-dd", "yyyyMMdd",
+            "yyyy/MM/dd", "yyyy-MM-dd HH:mm:ss", "yyyyMMddHHmmss", "yyyy/MM/dd HH:mm:ss"};
+
+    public DateEditor(boolean emptyAsNull) {
+        this.emptyAsNull = emptyAsNull;
+    }
+
+    public DateEditor(boolean emptyAsNull, String dateFormat) {
+        this.emptyAsNull = emptyAsNull;
+        this.dateFormat = dateFormat;
+    }
+
+    public String getAsText() {
+        Date date = (Date) getValue();
+        return date != null ? new SimpleDateFormat(this.dateFormat).format(date) : "";
+    }
+
+    public void setAsText(String text) {
+        if (text == null) {
+            setValue(null);
+        } else {
+            String str = text.trim();
+            if ((this.emptyAsNull) && ("".equals(str)))
+                setValue(null);
+            else
+                try {
+                    setValue(DateUtils.parseDate(str, DATE_PATTERNS));
+                } catch (ParseException e) {
+                    setValue(null);
+                }
+        }
+    }
+}

+ 190 - 0
4dkankan-common/src/main/java/com/fdkankan/common/util/PasswordUtils.java

@@ -0,0 +1,190 @@
+package com.fdkankan.common.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+import java.security.Key;
+import java.security.SecureRandom;
+
+public class PasswordUtils {
+
+
+    /**
+     * JAVA6支持以下任意一种算法 PBEWITHMD5ANDDES PBEWITHMD5ANDTRIPLEDES
+     * PBEWITHSHAANDDESEDE PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1
+     * */
+
+    /**
+     * 定义使用的算法为:PBEWITHMD5andDES算法
+     */
+    public static final String ALGORITHM = "PBEWithMD5AndDES";//加密算法
+    public static final String Salt = "63293188";//密钥
+
+    /**
+     * 定义迭代次数为1000次
+     */
+    private static final int ITERATIONCOUNT = 1000;
+
+    /**
+     * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节
+     *
+     * @return byte[] 盐值
+     */
+    public static byte[] getSalt() throws Exception {
+        // 实例化安全随机数
+        SecureRandom random = new SecureRandom();
+        // 产出盐
+        return random.generateSeed(8);
+    }
+
+    public static byte[] getStaticSalt() {
+        // 产出盐
+        return Salt.getBytes();
+    }
+
+    /**
+     * 根据PBE密码生成一把密钥
+     *
+     * @param password 生成密钥时所使用的密码
+     * @return Key PBE算法密钥
+     */
+    private static Key getPBEKey(String password) {
+        // 实例化使用的算法
+        SecretKeyFactory keyFactory;
+        SecretKey secretKey = null;
+        try {
+            keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
+            // 设置PBE密钥参数
+            PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
+            // 生成密钥
+            secretKey = keyFactory.generateSecret(keySpec);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        return secretKey;
+    }
+
+    /**
+     * 加密明文字符串
+     *
+     * @param plaintext 待加密的明文字符串
+     * @param password  生成密钥时所使用的密码
+     * @param salt      盐值
+     * @return 加密后的密文字符串
+     * @throws Exception
+     */
+    public static String encrypt(String plaintext, String password, byte[] salt) {
+
+        Key key = getPBEKey(password);
+        byte[] encipheredData = null;
+        PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, ITERATIONCOUNT);
+        try {
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+
+            cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
+
+            encipheredData = cipher.doFinal(plaintext.getBytes());
+        } catch (Exception e) {
+        }
+        return bytesToHexString(encipheredData);
+    }
+
+    /**
+     * 解密密文字符串
+     *
+     * @param ciphertext 待解密的密文字符串
+     * @param password   生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致)
+     * @param salt       盐值(如需解密,该参数需要与加密时使用的一致)
+     * @return 解密后的明文字符串
+     * @throws Exception
+     */
+    public static String decrypt(String ciphertext, String password, byte[] salt) {
+
+        Key key = getPBEKey(password);
+        byte[] passDec = null;
+        PBEParameterSpec parameterSpec = new PBEParameterSpec(getStaticSalt(), ITERATIONCOUNT);
+        try {
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+
+            cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
+
+            passDec = cipher.doFinal(hexStringToBytes(ciphertext));
+        } catch (Exception e) {
+            // TODO: handle exception
+        }
+        return new String(passDec);
+    }
+
+    /**
+     * 将字节数组转换为十六进制字符串
+     *
+     * @param src 字节数组
+     * @return
+     */
+    public static String bytesToHexString(byte[] src) {
+        StringBuilder stringBuilder = new StringBuilder("");
+        if (src == null || src.length <= 0) {
+            return null;
+        }
+        for (int i = 0; i < src.length; i++) {
+            int v = src[i] & 0xFF;
+            String hv = Integer.toHexString(v);
+            if (hv.length() < 2) {
+                stringBuilder.append(0);
+            }
+            stringBuilder.append(hv);
+        }
+        return stringBuilder.toString();
+    }
+
+    /**
+     * 将十六进制字符串转换为字节数组
+     *
+     * @param hexString 十六进制字符串
+     * @return
+     */
+    public static byte[] hexStringToBytes(String hexString) {
+        if (hexString == null || hexString.equals("")) {
+            return null;
+        }
+        hexString = hexString.toUpperCase();
+        int length = hexString.length() / 2;
+        char[] hexChars = hexString.toCharArray();
+        byte[] d = new byte[length];
+        for (int i = 0; i < length; i++) {
+            int pos = i * 2;
+            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+        }
+        return d;
+    }
+
+    private static byte charToByte(char c) {
+        return (byte) "0123456789ABCDEF".indexOf(c);
+    }
+
+    public static void main(String[] args) {
+
+        //管理后台密码加解密
+        String userName = "admin6";
+        String password = "123456";
+
+        try {
+            byte[] salt = PasswordUtils.getStaticSalt();
+            String ciphertext = PasswordUtils.encrypt(userName, password, salt);
+            System.out.println(ciphertext);
+            String plaintext = PasswordUtils.decrypt(ciphertext, password, salt);
+            System.out.println(plaintext);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+
+
+    }
+
+}

+ 4 - 0
4dkankan-pom/pom.xml

@@ -25,6 +25,10 @@
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.springframework.cloud</groupId>