k94314517
2024-07-22 716ab46fb071ed48bc75d10fabed66bd8fcae6f1
server/service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
@@ -65,27 +65,34 @@
                HandlerMethod handlerMethod = (HandlerMethod) handler;
                Class<?> beanType = handlerMethod.getBeanType();
//                Method method = handlerMethod.getMethod();
                Boolean checkFlag = false;
                if(!(
                    beanType.isAnnotationPresent(LoginRequired.class) || handlerMethod.hasMethodAnnotation(LoginRequired.class)
                            || beanType.isAnnotationPresent(UserLoginRequired.class) || handlerMethod.hasMethodAnnotation(UserLoginRequired.class))
                ){
                    return true;
                }
                // 有 @LoginRequired 注解,需要登录认证 客户端使用
                if (beanType.isAnnotationPresent(LoginRequired.class) || handlerMethod.hasMethodAnnotation(LoginRequired.class)) {
                    //获取token
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // 从 http 请求头中取出 token
                    if (StringUtils.isNotBlank(token)) {
                        checkLogin(request,response);
                    } else {
                if (!checkFlag && (beanType.isAnnotationPresent(LoginRequired.class) || handlerMethod.hasMethodAnnotation(LoginRequired.class))) {
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
                    if(StringUtils.isBlank(token)){
                        throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                    }
                    // 有 @UserLoginRequired 注解,需要登录认证 内部人员使用
                } else if(beanType.isAnnotationPresent(UserLoginRequired.class) || handlerMethod.hasMethodAnnotation(UserLoginRequired.class)){
                        //ERP 业务注解
                        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
                        if (StringUtils.isNotBlank(token)) {
                            checkPersonnelLogin(request,response);
                        } else {
                            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                        }
                    if (StringUtils.isNotBlank(token)) {
                        checkFlag = checkLogin(request,response,token);
                    }
                }
                if(!checkFlag && (beanType.isAnnotationPresent(UserLoginRequired.class) || handlerMethod.hasMethodAnnotation(UserLoginRequired.class))){
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
                    if(StringUtils.isBlank(token)){
                        throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                    }
                    if (StringUtils.isNotBlank(token)) {
                        checkFlag = checkPersonnelLogin(request,response,token);
                    }
                }
                if(!checkFlag){
                    throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                }
                return true;
            }
@@ -94,20 +101,14 @@
    }
    public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response){
        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
    public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response,String token){
        try {
            //获取账号ID
            Long memberId = JwtTokenUtil.getJwtPayLoad(token).getUserId();
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.CUSTOMER+"_"+memberId);
            if(StringUtils.isNotBlank(tokenRedis)){
                if(!tokenRedis.equals(token)){
                    throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
                }
            }else{
                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.CUSTOMER+"_"+token);
            if(StringUtils.isBlank(tokenRedis)){
                return false;
            }
            Member member = dao.queryForObject(" select  *  from `member` where id  = ?  limit 1  ", new BeanPropertyRowMapper<>(Member.class),memberId );
            Long memberId = getTokenId(token);
            Member member = dao.queryForObject(" select  *  from `member` where id  = ?  limit 1  ", new BeanPropertyRowMapper<>(Member.class),memberId);
            if(Objects.isNull(member)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY);
            }
@@ -125,19 +126,13 @@
        }
    }
    public Boolean checkPersonnelLogin(HttpServletRequest request, HttpServletResponse response){
        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
    public Boolean checkPersonnelLogin(HttpServletRequest request, HttpServletResponse response,String token){
        try {
            //获取账号ID
            Long userId = JwtTokenUtil.getJwtPayLoad(token).getUserId();
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.BUSINESS+"_"+userId);
            if(StringUtils.isNotBlank(tokenRedis)){
                if(!tokenRedis.equals(token)){
                    throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
                }
            }else{
                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.BUSINESS+"_"+token);
            if(StringUtils.isBlank(tokenRedis)){
                return false;
            }
            Long userId = getTokenId(token);
            Users users = dao.queryForObject(" select  *  from `users` where id  = ?  limit 1  ", new BeanPropertyRowMapper<>(Users.class),userId);
            if(Objects.isNull(users)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY);
@@ -161,5 +156,14 @@
        return new RestTemplate();
    }
    public Long getTokenId(String token){
        try {
            Integer lastIndex = token.lastIndexOf("_")+1;
            Long tokenId = Long.valueOf(token.substring(lastIndex));
            return tokenId;
        }catch (Exception e){
            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
        }
    }
}