package cn.mb.cloud.auth.security.social.handler; import cn.hutool.core.util.StrUtil; import cn.mb.cloud.auth.security.entity.User; import cn.mb.cloud.auth.security.service.IUserService; import cn.mb.cloud.common.api.vo.UserVO; import cn.mb.cloud.common.cache.RedisFastJsonTemplate; import cn.mb.cloud.common.core.constant.CacheConstants; import cn.mb.cloud.common.core.constant.enums.LoginTypeEnum; import cn.mb.cloud.common.core.exception.ValidateCodeException; import cn.mb.cloud.common.core.util.WebUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; /** * @author jason * @date 2018/11/18 */ @Slf4j @Component("SMS") @AllArgsConstructor public class SmsLoginHandler extends AbstractLoginHandler { private final IUserService userService; private final RedisFastJsonTemplate redisTemplate; /** * 验证码登录传入为手机号 不用不处理 * * @param mobile * @return */ @Override public String identify(String mobile) { return mobile; } @Override public Boolean check(String loginStr) { checkCode(loginStr, WebUtils.getRequest()); return Boolean.TRUE; } /** * 通过mobile 获取用户信息 * * @param identify * @return */ @Override public UserVO info(String identify, String threeAvatar, String threeName) { //进行收集号码等 User user = userService.getOne(Wrappers.query().lambda() .eq(User::getUsername, identify) .eq(User::getDelFlag, 0)); if (user == null) { log.info("手机号未注册:{}", identify); return null; } UserVO userVO = new UserVO(); BeanUtils.copyProperties(user, userVO); return userVO; } /** * 检查code * * @param request */ @SneakyThrows private void checkCode(String loginStr, HttpServletRequest request) { String code = request.getParameter("code"); if (StrUtil.isBlank(code)) { throw new ValidateCodeException("验证码不能为空"); } String key = CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + loginStr; if (!redisTemplate.hasKey(key)) { throw new ValidateCodeException("验证码不合法"); } Object codeObj = redisTemplate.opsForValue().get(key); if (codeObj == null) { throw new ValidateCodeException("验证码不合法"); } String saveCode = codeObj.toString(); if (StrUtil.isBlank(saveCode)) { redisTemplate.delete(key); throw new ValidateCodeException("验证码不合法"); } if (!StrUtil.equals(saveCode, code)) { redisTemplate.delete(key); throw new ValidateCodeException("验证码不合法"); } redisTemplate.delete(key); } }