浏览代码

根据 门户登录接口 返回错误编码提示不同错误消息, Web、APP、大屏 Token生效时间可以单独配置

zhulu 11 月之前
父节点
当前提交
34c353f86a

+ 23 - 0
soc-auth/src/main/java/com/xunmei/auth/controller/TokenController.java

@@ -78,6 +78,29 @@ public class TokenController {
     }
 
     /**
+     * 大屏登录
+     * @param form
+     * @return
+     */
+    @PostMapping("loginLargeScreen")
+    public R<?> loginLargeScreen(@RequestBody LoginBody form) {
+
+        try {
+            if (!SecurityUtils.isApp()) {
+                //登录重放问题处理,待前端完成放开
+                //loginService.checkLogin(form.getAuthCode());
+            }
+
+            LoginUser userInfo = loginService.loginByPassword(form.getUsername(), form.getPassword(), Constants.LOGIN_TYPE_2);
+            // 获取登录token
+            return R.ok(tokenService.createToken(userInfo));
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+        // 用户登录
+    }
+
+    /**
      * APP 端切换用户
      * @param subUserId
      * @return

+ 14 - 1
soc-auth/src/main/java/com/xunmei/auth/service/FJNXLoginService.java

@@ -8,6 +8,7 @@ import com.alibaba.fastjson2.JSON;
 import com.union.api.TUnionTransInfo;
 import com.union.api.UnionEsscAPI;
 import com.xunmei.auth.form.LoginBody;
+import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.utils.StringUtils;
 import io.netty.util.internal.StringUtil;
 import org.slf4j.Logger;
@@ -259,8 +260,20 @@ public class FJNXLoginService{
             logger.info("登录后的token:{}",tokenThird);
             return  tokenThird;
         }
-
         logger.error("登录失败,{}",jsonObject.getStr("message"));
+
+        //10100000	登录失败,账号或密码错误	密码错误,密码未送
+        //10100003	登录失败,账号或密码错误	用户不存在
+        if("10100000".equals(code) || "10100003".equals(code))
+        {
+            throw new ServiceException("登录失败,账号或密码错误");
+        }
+        //10200001	登录失败,请到统一运营门户输入账号完成维护	用户状态未启用
+        //10300008	登录失败,请到统一运营门户输入账号完成维护	超过登录尝试次数用户状态禁用
+        //10200004	登录失败,请到统一运营门户输入账号完成维护	密码太久未修改
+        else if("10200001".equals(code)||  "10200004".equals(code) || "10300008".equals(code) ){
+            throw new ServiceException("登录失败,请到统一运营门户输入账号完成维护");
+        }
         return  null;
     }
 }

+ 5 - 1
soc-auth/src/main/java/com/xunmei/auth/service/SysLoginService.java

@@ -107,7 +107,11 @@ public class SysLoginService{
             }
             // 如果统一门户验证失败, 再走本系统默认密码验证
             catch (Exception e){
-//                e.printStackTrace();
+                // 发现是因为这两种错误登录失败,将错误抛出
+                if("登录失败,账号或密码错误".equals(e.getMessage()) || "登录失败,请到统一运营门户输入账号完成维护".equals(e.getMessage()))
+                {
+                    throw e;
+                }
                 passwordService.validate(user, password, platformType);
             }
         }

+ 2 - 0
soc-auth/src/main/java/com/xunmei/auth/service/SysRecordLogService.java

@@ -7,6 +7,7 @@ import com.xunmei.common.core.utils.ip.IpUtils;
 import com.xunmei.system.api.RemoteLogService;
 import com.xunmei.system.api.domain.SysLogininfor;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import java.util.Date;
@@ -31,6 +32,7 @@ public class SysRecordLogService
      * @param platformType 登录平台
      * @return
      */
+    @Async
     public void recordLogininfor(String username, String status, String message,String platformType)
     {
         SysLogininfor logininfor = new SysLogininfor();

+ 5 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/Constants.java

@@ -151,6 +151,11 @@ public class Constants {
     public static final String LOGIN_TYPE_1 = "1";
 
     /**
+     * 监控中心大屏端登录
+     */
+    public static final String LOGIN_TYPE_2 = "2";
+
+    /**
      * 数字常量
      */
     public static final Integer ONE = 1;

+ 128 - 70
soc-common/soc-common-security/src/main/java/com/xunmei/common/security/service/TokenService.java

@@ -2,6 +2,7 @@ package com.xunmei.common.security.service;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.xunmei.common.core.constant.CacheConstants;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.constant.SystemParameterConstant;
 import com.xunmei.common.core.utils.DateUtils;
@@ -16,6 +17,8 @@ import com.xunmei.system.api.RemoteConfigService;
 import com.xunmei.system.api.RemoteUserService;
 import com.xunmei.system.api.domain.SysConfig;
 import com.xunmei.system.api.model.LoginUser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -34,7 +37,7 @@ import java.util.concurrent.TimeUnit;
  */
 @Component
 public class TokenService {
-
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
     @Autowired
     private RemoteUserService remoteUserService;
 
@@ -59,7 +62,7 @@ public class TokenService {
 
         String userName = loginUser.getSysUser().getName();
         if(StringUtils.isEmpty(loginUser.getToken())){
-            String token = userId + "_" + IdUtils.fastUUID();
+            String token = userId + "_"+ loginUser.getPlatformType()+"_" + IdUtils.fastUUID();
             loginUser.setToken(token);
         }
 
@@ -68,7 +71,8 @@ public class TokenService {
         loginUser.setOrgId(loginUser.getSysUser().getOrgId());
         loginUser.setName(loginUser.getSysUser().getName());
         loginUser.setIpaddr(IpUtils.getIpAddr());
-        refreshToken(loginUser);
+        long configExpireTime =  getTokenExpireTime(loginUser.getPlatformType());
+        refreshTokenNew(loginUser,configExpireTime);
 
         // Jwt存储信息
         Map<String, Object> claimsMap = new HashMap<String, Object>();
@@ -81,68 +85,46 @@ public class TokenService {
         // 接口返回信息
         Map<String, Object> rspMap = new HashMap<String, Object>();
         rspMap.put("access_token", JwtUtils.createToken(claimsMap));
-        rspMap.put("expires_in", expireTime);
+        rspMap.put("expires_in", configExpireTime);
         return rspMap;
     }
 
     /**
      * 创建令牌
+     *
      */
     public Map<String, Object> createTokenNew(LoginUser loginUser, Integer loginFrom) {
-        Long userId = loginUser.getSysUser().getId();
-
-        String userName = loginUser.getSysUser().getName();
-        if(StringUtils.isEmpty(loginUser.getToken())){
-            String token = userId + "_" + IdUtils.fastUUID();
-            loginUser.setToken(token);
-        }
-
-        loginUser.setUserid(userId);
-        loginUser.setUsername(userName);
-        loginUser.setOrgId(loginUser.getSysUser().getOrgId());
-        loginUser.setName(loginUser.getSysUser().getName());
-        loginUser.setIpaddr(IpUtils.getIpAddr());
-
-        long configExpireTime = expireTime;
-        if(loginFrom != null){
-            if(loginFrom == 0){
-                //大屏
-                final SysConfig config = remoteConfigService.findSysConfigByCode(SystemParameterConstant.TOKEN_LARGESCREEN_EXPIRETIME, SecurityConstants.INNER);
-                if (ObjectUtil.isNotEmpty(config)){
-                    configExpireTime = Long.parseLong(config.getConfigValue());
-                }
-            }
-            else if(loginFrom == 1){
-                //app
-                final SysConfig config = remoteConfigService.findSysConfigByCode(SystemParameterConstant.TOKEN_APP_EXPIRETIME, SecurityConstants.INNER);
-                if (ObjectUtil.isNotEmpty(config)){
-                    configExpireTime = Long.parseLong(config.getConfigValue());
-                }
-            }else if(loginFrom == 2){
-                //app
-                final SysConfig config = remoteConfigService.findSysConfigByCode(SystemParameterConstant.TOKEN_WEB_EXPIRETIME, SecurityConstants.INNER);
-                if (ObjectUtil.isNotEmpty(config)){
-                    configExpireTime = Long.parseLong(config.getConfigValue());
-                }
-            }
-        }
-
-
-        refreshTokenNew(loginUser,configExpireTime);
-
-        // Jwt存储信息
-        Map<String, Object> claimsMap = new HashMap<String, Object>();
-        claimsMap.put(SecurityConstants.USER_KEY, loginUser.getToken());
-        claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
-        claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
-        claimsMap.put(SecurityConstants.DETAILS_MASTER_USER_ID, loginUser.getMasterUserId());
-        claimsMap.put(SecurityConstants.DETAILS_MASTERUSERNAME, loginUser.getMasterUserName());
-
-        // 接口返回信息
-        Map<String, Object> rspMap = new HashMap<String, Object>();
-        rspMap.put("access_token", JwtUtils.createToken(claimsMap));
-        rspMap.put("expires_in", configExpireTime);
-        return rspMap;
+        //现场大屏登录也是 走APP登录接口,但是请求携带了 loginFrom 参数;根据 loginFrom 转换 PlatformType 值
+        loginUser.setPlatformType(getPlatformTypeByLoginFrom(loginFrom));
+        return createToken(loginUser);
+//        Long userId = loginUser.getSysUser().getId();
+//        String userName = loginUser.getSysUser().getName();
+//        if(StringUtils.isEmpty(loginUser.getToken())){
+//            String token = userId + "_" + IdUtils.fastUUID();
+//            loginUser.setToken(token);
+//        }
+//
+//        loginUser.setUserid(userId);
+//        loginUser.setUsername(userName);
+//        loginUser.setOrgId(loginUser.getSysUser().getOrgId());
+//        loginUser.setName(loginUser.getSysUser().getName());
+//        loginUser.setIpaddr(IpUtils.getIpAddr());
+//        long configExpireTime =  getTokenExpireTime(loginUser.getPlatformType());
+//        refreshTokenNew(loginUser,configExpireTime);
+//
+//        // Jwt存储信息
+//        Map<String, Object> claimsMap = new HashMap<String, Object>();
+//        claimsMap.put(SecurityConstants.USER_KEY, loginUser.getToken());
+//        claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
+//        claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
+//        claimsMap.put(SecurityConstants.DETAILS_MASTER_USER_ID, loginUser.getMasterUserId());
+//        claimsMap.put(SecurityConstants.DETAILS_MASTERUSERNAME, loginUser.getMasterUserName());
+//
+//        // 接口返回信息
+//        Map<String, Object> rspMap = new HashMap<String, Object>();
+//        rspMap.put("access_token", JwtUtils.createToken(claimsMap));
+//        rspMap.put("expires_in", configExpireTime);
+//        return rspMap;
     }
 
     /**
@@ -213,6 +195,7 @@ public class TokenService {
         long expireTime = loginUser.getExpireTime();
         long currentTime = System.currentTimeMillis();
         if (expireTime - currentTime <= MILLIS_MINUTE_TEN) {
+            logger.info("Token 即将过期,刷新Token 有效时间,{}",loginUser.getToken());
             refreshToken(loginUser);
         }
     }
@@ -223,16 +206,21 @@ public class TokenService {
      * @param loginUser 登录信息
      */
     public void refreshToken(LoginUser loginUser) {
-        loginUser.setLoginTime(System.currentTimeMillis());
-        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
-        // 根据uuid将loginUser缓存
-        String userKey = getTokenKey(loginUser.getToken());
-        remoteUserService.userLoginInfo(loginUser.getUserid(), DateUtils.getNowDate(), loginUser.getIpaddr(), SecurityConstants.INNER);
-        //登陆后删除之前的token
-        RedisUtils.deleteByPrefix(userKey);
-        RedisUtils.setCacheObject(userKey, loginUser, Duration.ofMinutes(expireTime));
-        //redisService.deleteByPrefix(userKey);
-        // redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+//        loginUser.setLoginTime(System.currentTimeMillis());
+//        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+//        // 根据uuid将loginUser缓存
+//        String userKey = getTokenKey(loginUser.getToken());
+////        remoteUserService.userLoginInfo(loginUser.getUserid(), DateUtils.getNowDate(), loginUser.getIpaddr(), SecurityConstants.INNER);
+//        //登陆后删除之前的token
+//        // admin 用户的 ID 是1 按前缀删除缓存时 会把其他人的Token都删除掉, 固排除 admin
+//        if(!"admin".equals(loginUser.getSysUser().getUsername())){
+//            String userKeyPrefix= getTokenKey(loginUser.getUserid().toString());
+//            RedisUtils.deleteByPrefix(userKeyPrefix);
+//        }
+//        RedisUtils.setCacheObject(userKey, loginUser, Duration.ofMinutes(expireTime));
+//        //redisService.deleteByPrefix(userKey);
+//        // redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+        refreshTokenNew(loginUser,expireTime);
     }
 
     /**
@@ -245,9 +233,14 @@ public class TokenService {
         loginUser.setExpireTime(loginUser.getLoginTime() + configExpireTime * MILLIS_MINUTE);
         // 根据uuid将loginUser缓存
         String userKey = getTokenKey(loginUser.getToken());
-        remoteUserService.userLoginInfo(loginUser.getUserid(), DateUtils.getNowDate(), loginUser.getIpaddr(), SecurityConstants.INNER);
+//        remoteUserService.userLoginInfo(loginUser.getUserid(), DateUtils.getNowDate(), loginUser.getIpaddr(), SecurityConstants.INNER);
         //登陆后删除之前的token
-        RedisUtils.deleteByPrefix(userKey);
+        // admin 用户的 ID 是1 按前缀删除缓存时 会把其他人的Token都删除掉, 固排除 admin
+        if(!"admin".equals(loginUser.getSysUser().getUsername())){
+            String userKeyPrefix= getTokenKey(loginUser.getUserid().toString()+"_"+loginUser.getPlatformType());
+            RedisUtils.deleteByPrefix(userKeyPrefix);
+        }
+
         RedisUtils.setCacheObject(userKey, loginUser, Duration.ofMinutes(configExpireTime));
         //redisService.deleteByPrefix(userKey);
         // redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
@@ -256,4 +249,69 @@ public class TokenService {
     private String getTokenKey(String token) {
         return ACCESS_TOKEN + token;
     }
+
+    private Long getTokenExpireTime(String platformType)
+    {
+        long configExpireTime = 0;
+        String configExpireTimeStr = "";
+        if(platformType != null){
+            if(Constants.LOGIN_TYPE_2.equals(platformType)){
+                //大屏
+                String screenCacheKey=CacheConstants.SYS_CONFIG_KEY+SystemParameterConstant.TOKEN_LARGESCREEN_EXPIRETIME;
+                configExpireTimeStr= getConfigValueFromRedis(screenCacheKey);
+            }
+            else if(Constants.LOGIN_TYPE_0.equals(platformType)){
+                //app
+                String appCacheKey=CacheConstants.SYS_CONFIG_KEY+SystemParameterConstant.TOKEN_APP_EXPIRETIME;
+                configExpireTimeStr= getConfigValueFromRedis(appCacheKey);
+            }else if(Constants.LOGIN_TYPE_1.equals(platformType)){
+                //web
+                String webCacheKey=CacheConstants.SYS_CONFIG_KEY+SystemParameterConstant.TOKEN_WEB_EXPIRETIME;
+                configExpireTimeStr= getConfigValueFromRedis(webCacheKey);
+            }
+        }
+        if(StringUtils.isNotEmpty(configExpireTimeStr))
+        {
+            configExpireTime=  Long.parseLong(configExpireTimeStr);
+        }
+        else{
+            configExpireTime=expireTime;
+        }
+        return configExpireTime;
+    }
+
+    private String getConfigValueFromRedis(String cacheKey)
+    {
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    private String getPlatformTypeByLoginFrom(Integer logFrom) {
+        // loginFrom 0 大屏,1 app ,2 web
+        // 大屏登录时会带入 logFrom 参数
+        //移动端端登录
+        if (logFrom==null || logFrom==1) {
+            // app
+            return Constants.LOGIN_TYPE_0;
+        }
+        if(logFrom==0)
+        {
+            // 大屏
+            return Constants.LOGIN_TYPE_2;
+        }
+        if(logFrom==2)
+        {
+            // web
+            return Constants.LOGIN_TYPE_1;
+        }
+        // 默认为APP登录
+        return Constants.LOGIN_TYPE_0;
+    }
 }

+ 9 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysMenuController.java

@@ -1,5 +1,6 @@
 package com.xunmei.system.controller;
 
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.UserConstants;
 import com.xunmei.common.core.utils.StringUtils;
 import com.xunmei.common.core.web.controller.BaseController;
@@ -102,6 +103,7 @@ public class SysMenuController extends BaseController {
             return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
         }
         menu.setUpdateBy(SecurityUtils.getUsername());
+        //menuService.clearCacheMenu();
         return toAjax(menuService.updateMenu(menu));
     }
 
@@ -129,7 +131,13 @@ public class SysMenuController extends BaseController {
     @GetMapping("getRouters")
     public AjaxResult getRouters() {
         LoginUser loginUser = SecurityUtils.getLoginUser();
-        List<SysMenu> menus = menuService.selectMenuTreeByUserId(loginUser.getUserid(), loginUser.getPlatformType());
+        String platformType = loginUser.getPlatformType();
+        // 菜单分类只有 2种 :Web、APP; 大屏登录后获取的菜单是APP端菜单,固转换为 APP
+        if(Constants.LOGIN_TYPE_2.equals(loginUser.getPlatformType()))
+        {
+            platformType=Constants.LOGIN_TYPE_0;
+        }
+        List<SysMenu> menus = menuService.selectMenuTreeByUserId(loginUser.getUserid(), platformType);
         return success(menuService.buildMenus(menus));
     }
 }