deason 7 年之前
父節點
當前提交
8588ace4c9

+ 5 - 23
src/main/java/cn/com/qmth/examcloud/app/controller/version_1_0/UserAuthRestController.java

@@ -7,16 +7,12 @@
 
 package cn.com.qmth.examcloud.app.controller.version_1_0;
 
-import cn.com.qmth.examcloud.app.core.utils.StrUtils;
 import cn.com.qmth.examcloud.app.model.LoginInfo;
-import cn.com.qmth.examcloud.app.model.LoginType;
 import cn.com.qmth.examcloud.app.model.Result;
 import cn.com.qmth.examcloud.app.model.User;
-import cn.com.qmth.examcloud.app.service.RedisService;
 import cn.com.qmth.examcloud.app.service.UserAuthService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,8 +20,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 
-import static cn.com.qmth.examcloud.app.model.Constants.APP_SESSION_EXPIRE_TIME;
-
 /**
  * 认证中心相关接口
  *
@@ -40,29 +34,17 @@ public class UserAuthRestController {
     private final static Logger log = LoggerFactory.getLogger(UserAuthRestController.class);
     @Autowired
     private UserAuthService userAuthService;
-    @Autowired
-    private RedisService redisService;
 
     @ApiOperation(value = "登录接口")
     @RequestMapping(value = "/user/login", method = {RequestMethod.GET, RequestMethod.POST})
     public Result<User> login(@RequestParam String account, @RequestParam String password, @RequestParam(required = false) String accountType,
                               @RequestParam(required = false) Long rootOrgId, @RequestParam(required = false) String domain) throws Exception {
-        if (StringUtils.isBlank(accountType)) {
-            accountType = LoginType.COMMON_LOGIN_NAME.name();
+        LoginInfo loginInfo = new LoginInfo(account, password, accountType, rootOrgId, domain);
+        Result<User> result = userAuthService.login(loginInfo);
+        if (result.isSuccess()) {
+            //缓存登录信息
+            //userAuthService.cacheLoginInfo(loginInfo, result.getData());
         }
-        Result<User> result = userAuthService.login(account, password, accountType, rootOrgId, domain);
-        /*if (result.isSuccess()) {
-            //获取当前登录用户信息
-            User userInfo = result.getData();
-            //封装原始登录信息
-            LoginInfo loginInfo = new LoginInfo(account, password, accountType, rootOrgId, domain, userInfo.getKey(), userInfo.getToken());
-            //将原始登录信息存放到Redis中
-            String redisKey = StrUtils.md5Key(userInfo.getKey());
-            redisService.cacheUserToken(redisKey, loginInfo, APP_SESSION_EXPIRE_TIME);
-            log.debug("redisKey:" + redisKey + " loginToken:" + loginInfo.getToken());
-            //替换login token为缓存的redisKey,并作为接口的结果返回
-            userInfo.setToken(redisKey);
-        }*/
         return result;
     }
 

+ 24 - 36
src/main/java/cn/com/qmth/examcloud/app/core/config/AccessInterceptor.java

@@ -12,7 +12,6 @@ import cn.com.qmth.examcloud.app.model.LoginInfo;
 import cn.com.qmth.examcloud.app.model.Result;
 import cn.com.qmth.examcloud.app.model.User;
 import cn.com.qmth.examcloud.app.service.DeviceRecordService;
-import cn.com.qmth.examcloud.app.service.RedisService;
 import cn.com.qmth.examcloud.app.service.UserAuthService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -25,9 +24,12 @@ import javax.servlet.http.HttpServletResponse;
 import java.util.Date;
 import java.util.Map;
 
-import static cn.com.qmth.examcloud.app.model.Constants.*;
+import static cn.com.qmth.examcloud.app.model.Constants.PARAM_PASSWORD;
+import static cn.com.qmth.examcloud.app.model.Constants.PLATFORM_SESSION_EXPIRE_TIME;
 
 /**
+ * API请求拦截器
+ *
  * @author: fengdesheng
  * @since: 2018/7/16
  */
@@ -37,8 +39,6 @@ public class AccessInterceptor extends HandlerInterceptorAdapter {
     private DeviceRecordService deviceRecordService;
     @Autowired
     private UserAuthService userAuthService;
-    @Autowired
-    private RedisService redisService;
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
@@ -47,26 +47,26 @@ public class AccessInterceptor extends HandlerInterceptorAdapter {
         /*String redisKey = record.getLoginToken();
         if (StringUtils.isNotBlank(redisKey)) {
             //通过redisKey获取原始的登录信息,loginInfo为null则代表尚未登录
-            LoginInfo loginInfo = redisService.getUserToken(redisKey);
+            LoginInfo loginInfo = userAuthService.getLoginInfo(redisKey);
             if (loginInfo != null) {
                 //判断原始的login token是否在有效时间内
                 if (loginInfo.hasExpired(PLATFORM_SESSION_EXPIRE_TIME)) {
                     //已超过有效时间,则自动登录续期
-                    Result<User> result = userAuthService.login(loginInfo.getAccount(), loginInfo.getPassword(),
-                            loginInfo.getAccountType(), loginInfo.getRootOrgId(), loginInfo.getDomain());
+                    Result<User> result = userAuthService.login(loginInfo);
                     User userInfo = result.getData();
                     if (userInfo != null) {
                         //登录成功后缓存新的login token
-                        log.debug("redisKey:" + redisKey + " newLoginToken:" + loginInfo.getToken());
+                        log.debug("redisKey:" + redisKey + " newLoginToken:" + userInfo.getToken());
                         loginInfo.setToken(userInfo.getToken());
-                        redisService.cacheUserToken(redisKey, loginInfo, APP_SESSION_EXPIRE_TIME);
+                        loginInfo.setCreateTime(new Date());
+                        userAuthService.cacheLoginInfo(loginInfo, redisKey);
                     }
                 }
                 //将login token绑定到request请求中
                 request.setAttribute("loginToken", loginInfo.getToken());
             }
-            //初始化内部接口鉴权
-            //redisService.initTraceRequest();
+            //初始化内部接口请求鉴权
+            userAuthService.initRequestTrace();
         }*/
         //异步保存设备访问记录
         deviceRecordService.addDeviceRecord(record);
@@ -74,35 +74,23 @@ public class AccessInterceptor extends HandlerInterceptorAdapter {
     }
 
     private DeviceRecord parseParams(HttpServletRequest request) {
-        String system = request.getHeader("system");
-        String deviceId = request.getHeader("deviceId");
-        String netType = request.getHeader("netType");
-        String brand = request.getHeader("brand");
-        String model = request.getHeader("model");
-        String sysVersion = request.getHeader("sysVersion");
-        String appVersion = request.getHeader("appVersion");
-        String appCode = request.getHeader("appCode");
-        String patchCode = request.getHeader("patchCode");
-        String account = request.getHeader("account");
-        String key = request.getHeader("key");
-        String token = request.getHeader("token");
         String params = this.getParams(request);
         String url = request.getServletPath() + params;
         String ip = this.getIp(request);
-
+        //封装设备访问记录信息
         DeviceRecord record = new DeviceRecord();
-        record.setSystem(system);
-        record.setDeviceId(deviceId);
-        record.setNetType(netType);
-        record.setBrand(brand);
-        record.setModel(model);
-        record.setSysVersion(sysVersion);
-        record.setAppVersion(appVersion);
-        record.setAppCode(appCode);
-        record.setPatchCode(patchCode);
-        record.setAccount(account);
-        record.setLoginKey(key);
-        record.setLoginToken(token);
+        record.setSystem(request.getHeader("system"));
+        record.setDeviceId(request.getHeader("deviceId"));
+        record.setNetType(request.getHeader("netType"));
+        record.setBrand(request.getHeader("brand"));
+        record.setModel(request.getHeader("model"));
+        record.setSysVersion(request.getHeader("sysVersion"));
+        record.setAppVersion(request.getHeader("appVersion"));
+        record.setAppCode(request.getHeader("appCode"));
+        record.setPatchCode(request.getHeader("patchCode"));
+        record.setAccount(request.getHeader("account"));
+        record.setLoginKey(request.getHeader("key"));
+        record.setLoginToken(request.getHeader("token"));
         record.setUrl(url);
         record.setIp(ip);
         record.setCreateDate(new Date());

+ 10 - 1
src/main/java/cn/com/qmth/examcloud/app/model/LoginInfo.java

@@ -39,8 +39,17 @@ public class LoginInfo implements Serializable {
         this.createTime = new Date();
     }
 
-    public LoginInfo() {
+    public LoginInfo(String account, String password, String accountType, Long rootOrgId, String domain) {
+        this.account = account;
+        this.password = password;
+        this.accountType = accountType;
+        this.rootOrgId = rootOrgId;
+        this.domain = domain;
+        this.createTime = new Date();
+    }
 
+    public LoginInfo() {
+        this.createTime = new Date();
     }
 
     public boolean hasExpired(int seconds) {

+ 4 - 52
src/main/java/cn/com/qmth/examcloud/app/service/RedisService.java

@@ -7,12 +7,6 @@
 
 package cn.com.qmth.examcloud.app.service;
 
-import cn.com.qmth.examcloud.app.core.exception.ApiException;
-import cn.com.qmth.examcloud.app.core.utils.JsonMapper;
-import cn.com.qmth.examcloud.app.core.utils.ThreadUtils;
-import cn.com.qmth.examcloud.app.model.Constants;
-import cn.com.qmth.examcloud.app.model.LoginInfo;
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,8 +16,6 @@ import org.springframework.stereotype.Service;
 
 import java.util.concurrent.TimeUnit;
 
-import static cn.com.qmth.examcloud.app.model.Constants.APP_SESSION_USER_KEY_PREFIX;
-
 /**
  * Redis接口服务类
  *
@@ -58,52 +50,12 @@ public class RedisService {
         stringRedisTemplate.delete(key);
     }
 
-    /**
-     * 缓存用户登录信息
-     */
-    public void cacheUserToken(String key, LoginInfo loginInfo, long seconds) {
-        if (StringUtils.isEmpty(key)) {
-            throw new ApiException("Key must be not empty.");
-        }
-        this.set(APP_SESSION_USER_KEY_PREFIX + key, new JsonMapper().toJson(loginInfo), seconds);
-    }
-
-    /**
-     * 获取缓存中的用户登录信息
-     */
-    public LoginInfo getUserToken(String key) {
-        if (StringUtils.isEmpty(key)) {
-            throw new ApiException("Key must be not empty.");
-        }
-        String loginInfo = this.get(APP_SESSION_USER_KEY_PREFIX + key);
-        if (loginInfo != null) {
-            return new JsonMapper().fromJson(loginInfo, LoginInfo.class);
-        }
-        return null;
-    }
-
-    /**
-     * 初始化内部接口鉴权
-     */
-    public void initTraceRequest() {
-        String key = "C_" + ThreadUtils.getTraceID();
-        Long millis = System.currentTimeMillis();
-        this.set(key, millis.toString(), 10);
+    public StringRedisTemplate getStringRedisTemplate() {
+        return stringRedisTemplate;
     }
 
-    /**
-     * 获取平台端的默认过期时间(秒)
-     */
-    public int getSessionTimeout() {
-        try {
-            String timeout = this.get(Constants.PLATFORM_SESSION_TIMEOUT_KEY);
-            if (StringUtils.isNotEmpty(timeout)) {
-                return Integer.parseInt(timeout);
-            }
-        } catch (Exception e) {
-            //ignore
-        }
-        return Constants.PLATFORM_SESSION_EXPIRE_TIME;
+    public RedisTemplate<Object, Object> getRedisTemplate() {
+        return redisTemplate;
     }
 
 }

+ 12 - 1
src/main/java/cn/com/qmth/examcloud/app/service/UserAuthService.java

@@ -7,6 +7,7 @@
 
 package cn.com.qmth.examcloud.app.service;
 
+import cn.com.qmth.examcloud.app.model.LoginInfo;
 import cn.com.qmth.examcloud.app.model.Result;
 import cn.com.qmth.examcloud.app.model.User;
 
@@ -18,7 +19,7 @@ import cn.com.qmth.examcloud.app.model.User;
  */
 public interface UserAuthService {
 
-    Result<User> login(String account, String password, String accountType, Long rootOrgId, String domain) throws Exception;
+    Result<User> login(LoginInfo loginInfo) throws Exception;
 
     Result logout(String key, String token) throws Exception;
 
@@ -28,4 +29,14 @@ public interface UserAuthService {
 
     Result userBindingPhone(String key, String token, Long userId, String phone, String code);
 
+    void cacheLoginInfo(LoginInfo loginInfo, User userInfo);
+
+    void cacheLoginInfo(LoginInfo loginInfo, String key);
+
+    LoginInfo getLoginInfo(String key);
+
+    int getSessionTimeout();
+
+    void initRequestTrace();
+
 }

+ 88 - 17
src/main/java/cn/com/qmth/examcloud/app/service/impl/UserAuthServiceImpl.java

@@ -7,16 +7,14 @@
 
 package cn.com.qmth.examcloud.app.service.impl;
 
-import cn.com.qmth.examcloud.app.core.utils.HttpBuilder;
-import cn.com.qmth.examcloud.app.core.utils.HttpUtils;
-import cn.com.qmth.examcloud.app.core.utils.JsonMapper;
-import cn.com.qmth.examcloud.app.model.Constants;
-import cn.com.qmth.examcloud.app.model.ResBody;
-import cn.com.qmth.examcloud.app.model.Result;
-import cn.com.qmth.examcloud.app.model.User;
+import cn.com.qmth.examcloud.app.core.exception.ApiException;
+import cn.com.qmth.examcloud.app.core.utils.*;
+import cn.com.qmth.examcloud.app.model.*;
 import cn.com.qmth.examcloud.app.service.PropertyService;
+import cn.com.qmth.examcloud.app.service.RedisService;
 import cn.com.qmth.examcloud.app.service.UserAuthService;
 import okhttp3.*;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,8 +24,7 @@ import org.springframework.util.Assert;
 import java.util.HashMap;
 import java.util.Map;
 
-import static cn.com.qmth.examcloud.app.model.Constants.PARAM_KEY;
-import static cn.com.qmth.examcloud.app.model.Constants.PARAM_TOKEN;
+import static cn.com.qmth.examcloud.app.model.Constants.*;
 
 /**
  * 认证中心业务服务接口
@@ -40,17 +37,23 @@ public class UserAuthServiceImpl implements UserAuthService {
     private static Logger log = LoggerFactory.getLogger(UserAuthServiceImpl.class);
     @Autowired
     private PropertyService propertyService;
+    @Autowired
+    private RedisService redisService;
 
     @Override
-    public Result<User> login(String account, String password, String accountType, Long rootOrgId, String domain) throws Exception {
+    public Result<User> login(LoginInfo loginInfo) throws Exception {
+        Assert.notNull(loginInfo, "LoginInfo must be not null.");
+        if (StringUtils.isBlank(loginInfo.getAccountType())) {
+            loginInfo.setAccountType(LoginType.COMMON_LOGIN_NAME.name());
+        }
         //封装请求参数
         final String requestUrl = String.format("%s/api/ecs_core/auth/login", propertyService.getUserAuthUrl());
         Map<String, String> params = new HashMap<>();
-        params.put("accountValue", account);
-        params.put("password", password);
-        params.put("accountType", accountType);
-        params.put("rootOrgId", rootOrgId != null ? rootOrgId.toString() : "");
-        params.put("domain", domain);
+        params.put("accountValue", loginInfo.getAccount());
+        params.put("password", loginInfo.getPassword());
+        params.put("accountType", loginInfo.getAccountType());
+        params.put("rootOrgId", loginInfo.getRootOrgId() != null ? loginInfo.getRootOrgId().toString() : "");
+        params.put("domain", loginInfo.getDomain());
         String json = new JsonMapper().toJson(params);
         RequestBody formBody = FormBody.create(MediaType.parse(Constants.CHARSET_JSON_UTF8), json);
         Request request = new Request.Builder()
@@ -61,8 +64,8 @@ public class UserAuthServiceImpl implements UserAuthService {
         Response response = HttpBuilder.client.getInstance().newCall(request).execute();
         String bodyStr = response.body().string();
         if (response.isSuccessful()) {
-            JsonMapper mapper = new JsonMapper();
-            User userInfo = mapper.fromJson(bodyStr, User.class);
+            //获取用户信息
+            User userInfo = new JsonMapper().fromJson(bodyStr, User.class);
             return new Result().success(userInfo);
         } else {
             log.warn("Http response is " + bodyStr);
@@ -115,4 +118,72 @@ public class UserAuthServiceImpl implements UserAuthService {
         return new Result().error();
     }
 
+    @Override
+    public void cacheLoginInfo(LoginInfo loginInfo, User userInfo) {
+        if (loginInfo == null || userInfo == null) {
+            return;
+        }
+        //封装原始登录信息
+        loginInfo.setKey(userInfo.getKey());
+        loginInfo.setToken(userInfo.getToken());
+        //将原始登录信息存放到Redis中
+        String redisKey = StrUtils.md5Key(userInfo.getKey());
+        this.cacheLoginInfo(loginInfo, redisKey);
+        log.debug("redisKey:" + redisKey + " loginToken:" + loginInfo.getToken());
+        //替换login token为缓存的redisKey,并作为接口的结果返回
+        userInfo.setToken(redisKey);
+    }
+
+    /**
+     * 缓存用户登录信息
+     */
+    @Override
+    public void cacheLoginInfo(LoginInfo loginInfo, String key) {
+        if (StringUtils.isEmpty(key)) {
+            throw new ApiException("Key must be not empty.");
+        }
+        redisService.set(APP_SESSION_USER_KEY_PREFIX + key, new JsonMapper().toJson(loginInfo), APP_SESSION_EXPIRE_TIME);
+    }
+
+    /**
+     * 获取缓存中的用户登录信息
+     */
+    @Override
+    public LoginInfo getLoginInfo(String key) {
+        if (StringUtils.isEmpty(key)) {
+            throw new ApiException("Key must be not empty.");
+        }
+        String loginInfo = redisService.get(APP_SESSION_USER_KEY_PREFIX + key);
+        if (loginInfo != null) {
+            return new JsonMapper().fromJson(loginInfo, LoginInfo.class);
+        }
+        return null;
+    }
+
+    /**
+     * 获取平台端的默认过期时间(秒)
+     */
+    @Override
+    public int getSessionTimeout() {
+        try {
+            String timeout = redisService.get(Constants.PLATFORM_SESSION_TIMEOUT_KEY);
+            if (StringUtils.isNotEmpty(timeout)) {
+                return Integer.parseInt(timeout);
+            }
+        } catch (Exception e) {
+            //ignore
+        }
+        return Constants.PLATFORM_SESSION_EXPIRE_TIME;
+    }
+
+    /**
+     * 初始化内部接口请求鉴权
+     */
+    @Override
+    public void initRequestTrace() {
+        String key = "C_" + ThreadUtils.getTraceID();
+        Long millis = System.currentTimeMillis();
+        redisService.set(key, millis.toString(), 10);
+    }
+
 }