package cn.binux.sso.service.impl; import cn.binux.constant.Const; import cn.binux.mapper.TbUserMapper; import cn.binux.pojo.TbUser; import cn.binux.pojo.TbUserExample; import cn.binux.pojo.XbinResult; import cn.binux.redis.service.JedisClient; import cn.binux.sso.service.UserService; import cn.binux.utils.FastJsonConvert; import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.dubbo.config.annotation.Service; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.DigestUtils; import java.util.*; /** * 用户登录相关服务 Service 实现 * * @author xubin. * @create 2017-04-07 */ @Service(version = Const.XBIN_STORE_SSO_VERSION) @Transactional public class UserServiceImpl implements UserService { private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); public static final String KEY = "success"; public static final int ERROR = 1; public static final int SUCCESS = 0; @Autowired private TbUserMapper userMapper; @Reference(version = Const.XBIN_STORE_REDIS_VERSION) private JedisClient jedisClient; @Value("${redisKey.prefix.user_session}") private String USER_SESSION; @Value("${redisKey.expire_time}") private Integer EXPIRE_TIME; @Value("${login.validation.ispinengaged}") private String ISPINENGAGED; @Value("${login.validation.isemailengaged}") private String ISEMAILENGAGED; @Value("${login.validation.ismobileengaged}") private String ISMOBILEENGAGED; @Value("${login.random_number}") private Integer RANDOM_NUMBER; @Value("${redisKey.prefix.verifycode}") private String VERIFYCODE; @Value("${redisKey.prefix.mobile_login_code}") private String MOBILE_LOGIN_CODE; @Value("${login.success_url}") private String SUCCESS_URL; /** * 请求格式 GET * 注册数据校验 * * @param data 校验数据 * @param type 类型 可选参数1、2、3分别代表username、phone、email * @param callback 可选参数 有参表示jsonp调用 * @return { * status: 200 //200 成功 400 参数错误 500 系统异常 * msg: "OK" // 错误 参数错误 * data: false // 返回数据,true:数据可用,false:数据不可用 * } */ @Override public XbinResult checkUserDate(String data, Integer type, String callback) { if (StringUtils.isNotBlank(callback)) { return XbinResult.ok(callback); } TbUserExample example = new TbUserExample(); TbUserExample.Criteria criteria = example.createCriteria(); switch (type) { case ERROR: criteria.andUsernameEqualTo(data); break; case 2: criteria.andPhoneEqualTo(data); break; case 3: criteria.andEmailEqualTo(data); break; default: logger.error("type参数传递错误!"); return XbinResult.build(400,"error", "参数错误"); } List<TbUser> list = userMapper.selectByExample(example); if (list != null && list.size() > 0) { return XbinResult.ok(false); } return XbinResult.ok(true); } /** * 请求格式 POST * 用户注册 * * @param user Tbuser POJO Json * @return { * status: 200 //200 成功 400 数据错误 500 系统异常 * msg: "OK" //错误 注册失败. 请校验数据后请再提交数据. * data: null * } */ @Override public XbinResult register(TbUser user) { if (user == null) { return XbinResult.build(400, "error", "数据为空"); } boolean usernameb = (boolean) checkUserDate(user.getUsername(), ERROR, null).getData(); boolean phoneb = (boolean) checkUserDate(user.getPhone(), 2, null).getData(); boolean emailb = (boolean) checkUserDate(user.getEmail(), 3, null).getData(); if (usernameb & phoneb & emailb) { user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes())); user.setCreated(new Date()); user.setUpdated(new Date()); try { userMapper.insert(user); } catch (Exception e) { logger.error("保存数据库失败!注册失败", e); return XbinResult.build(500, "error", "系统异常. 请稍后重试"); } return XbinResult.ok(); } return XbinResult.build(400, "error", "注册失败. 请校验数据后请再提交数据"); } /** * 请求格式 POST * 用户登录 * * @param user Tbuser POJO Json * @return { * status: 200 //200 成功 400 登录失败 500 系统异常 * msg: "OK" //错误 用户名或密码错误,请检查后重试. * data: "fe5cb546aeb3ce1bf37abcb08a40493e" //登录成功,返回token * } */ @Override public XbinResult login(TbUser user) { if (user == null) { return XbinResult.build(400, "error", "数据为空"); } TbUserExample example = new TbUserExample(); TbUserExample.Criteria criteria = example.createCriteria(); criteria.andUsernameEqualTo(user.getUsername()); //criteria.andPasswordEqualTo(DigestUtils.md5DigestAsHex(tbUser.getPassword().getBytes())); List<TbUser> list = userMapper.selectByExample(example); if (list == null || list.size() == 0) { return XbinResult.build(400, "用户名不存在"); } TbUser check = list.get(0); if (!check.getPassword().equals(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()))) { return XbinResult.build(401, "用户名或密码错误"); } TbUser result = new TbUser(); result.setUsername(check.getUsername()); result.setId(check.getId()); String token = UUID.randomUUID().toString().replaceAll("-",""); String key = USER_SESSION + token; jedisClient.set(key, FastJsonConvert.convertObjectToJSON(result)); jedisClient.expire(key, EXPIRE_TIME); return XbinResult.ok(token); } /** * 请求格式 GET * 根据token值获取用户信息 * * @param token token值 * @param callback 可选参数 有参表示jsonp调用 * @return { * status: 200 //200 成功 400 没有此token 500 系统异常 * msg: "OK" //错误 没有此token. * data: {"username":"xbin","id":"id"} //返回用户名 * } */ @Override public XbinResult token(String token, String callback) { if (StringUtils.isNotBlank(callback)) { return XbinResult.ok(callback); } try { String user = jedisClient.get(USER_SESSION + token); if (StringUtils.isNotBlank(user)) { return XbinResult.ok(user); } } catch (Exception e) { logger.error("Redis服务出错"); } return XbinResult.build(400, "没有此用户"); } /** * 请求格式 GET * 根据token值 退出登录 * * @param token token值 * @param callback 可选参数 有参表示jsonp调用 * @return { * status: 200 //200 成功 400 没有此token 500 系统异常 * msg: "OK" //错误 没有此token. * data: null * } */ @Override public XbinResult logout(String token, String callback) { if (StringUtils.isNotBlank(callback)) { return XbinResult.ok(callback); } try { jedisClient.del(USER_SESSION + token); } catch (Exception e) { logger.error("没有登录", e); return XbinResult.build(400, "没有登录"); } return XbinResult.ok(); } /** * 请求格式 POST * 注册检查是否可用 * * @param isEngaged 需要检查是否使用的名称 * @return { * "success": 0 可用 1 不可用 * "morePin":["sssss740","sssss5601","sssss76676"] //isEngaged = isPinEngaged时返回推荐 * } */ @Override public String validateUser(String isEngaged,String regName,String email,String phone) { Random random = new Random(); HashMap<String, Object> map = new HashMap<>(); TbUserExample example = new TbUserExample(); TbUserExample.Criteria criteria = example.createCriteria(); if (StringUtils.isNotBlank(isEngaged)) { if (isEngaged.equals(ISPINENGAGED) && StringUtils.isNotBlank(regName)) { criteria.andUsernameEqualTo(regName); List<TbUser> users = userMapper.selectByExample(example); if (users == null || users.size() == 0) { //用户名 可用 map.put(KEY, 0); return FastJsonConvert.convertObjectToJSON(map); } //用户名 不可用 map.put(KEY, ERROR); ArrayList<String> morePin = new ArrayList<>(); morePin.add(regName + random.nextInt(RANDOM_NUMBER)); morePin.add(regName + random.nextInt(RANDOM_NUMBER)); morePin.add(regName + random.nextInt(RANDOM_NUMBER)); // 不考虑生成的用户名继续重名 map.put("morePin", morePin); return FastJsonConvert.convertObjectToJSON(map); } else { if (isEngaged.equals(ISEMAILENGAGED) && StringUtils.isNotBlank(email)) { criteria.andEmailEqualTo(email); List<TbUser> users = userMapper.selectByExample(example); if (users == null || users.size() == 0) { //email 可用 map.put(KEY, 0); return FastJsonConvert.convertObjectToJSON(map); } //email 不可用 map.put(KEY, ERROR); return FastJsonConvert.convertObjectToJSON(map); } else if (isEngaged.equals(ISMOBILEENGAGED) && StringUtils.isNotBlank(phone)) { criteria.andPhoneEqualTo(phone); List<TbUser> users = userMapper.selectByExample(example); if (users == null || users.size() == 0) { //phone 可用 map.put(KEY, 0); return FastJsonConvert.convertObjectToJSON(map); } //phone 不可用 map.put(KEY, ERROR); return FastJsonConvert.convertObjectToJSON(map); } } } logger.error("传递类型出错!"); map.put("error", ERROR); return FastJsonConvert.convertObjectToJSON(map); } /** * 请求格式 POST * 验证验证码 * * @param authCode 输入的验证码 * @param uuid Redis验证码uuid * @return { * "success": 0 可用 1 不可用 * } */ @Override public String validateAuthCode(String authCode, String uuid) { HashMap<String, Integer> map = new HashMap<>(); try { String redisAuthCode = jedisClient.get(VERIFYCODE + uuid); if (StringUtils.isBlank(redisAuthCode)) { map.put(KEY, ERROR); logger.info("Redis中根据key查询不到"); return FastJsonConvert.convertObjectToJSON(map); } if (StringUtils.isBlank(authCode)) { map.put(KEY, ERROR); logger.info("验证码为空"); return FastJsonConvert.convertObjectToJSON(map); } if (redisAuthCode.equalsIgnoreCase(authCode)) { map.put(KEY, SUCCESS); return FastJsonConvert.convertObjectToJSON(map); } } catch (Exception e) { logger.error("redis 服务出错", e); } map.put(KEY, ERROR); return FastJsonConvert.convertObjectToJSON(map); } /** * 请求格式 POST * 注册 * * @param regName 注册名 * @param pwd 第一次密码 * @param pwdRepeat 第二次密码 * @param phone 电话 * @param mobileCode 手机验证码 * @param email 邮箱 * @param authCode 输入的验证码 * @param uuid Redis验证码uuid * @return */ @Override public String register(String regName, String pwd, String pwdRepeat, String phone, String mobileCode, String uuid, String authCode, String email) { if (!pwd.equals(pwdRepeat)) { String info = "两次密码不正确"; return "({'info':'" + info + "'})"; } if (StringUtils.isNotBlank(authCode)) { String code = ""; try { code = jedisClient.get(VERIFYCODE + uuid); } catch (Exception e) { logger.error("Redis服务出错", e); } //if (StringUtils.isBlank(code)) { // String info = "验证码不正确或已过期,请重新获取"; // String convert = ConvertUtils.convert(info); // return "({'info':'" + convert + "'})"; //} if (StringUtils.isBlank(code) || !code.equalsIgnoreCase(authCode)) { String info = "验证码不正确或已过期,请重新获取"; return "({'info':'" + info + "'})"; } } else { String info = "验证码不能为空"; return "({'info':'" + info + "'})"; } if (StringUtils.isNotBlank(phone)) { String phone2 = phone.substring(5, phone.length()); String phonecode = ""; try { phonecode = jedisClient.get(MOBILE_LOGIN_CODE + phone2); } catch (Exception e) { logger.error("Redis服务出错"); } if (StringUtils.isBlank(phonecode) || !phonecode.equals(mobileCode)) { String info = "短信验证码不正确或已过期,请重新获取"; return "({'info':'" + info + "'})"; } } else { String info = "手机号码不能为空"; return "({'info':'" + info + "'})"; } if (StringUtils.isNotBlank(regName)) { TbUser user = new TbUser(); user.setUsername(regName); user.setPassword(DigestUtils.md5DigestAsHex(pwd.getBytes())); user.setPhone(phone); user.setCreated(new Date()); user.setUpdated(new Date()); if (StringUtils.isNotBlank(email)) { user.setEmail(email); } userMapper.insert(user); //注册成功 忽略noAuth这个词 return "({'noAuth':'" + SUCCESS_URL + "?username=" + regName + "'})"; } //注册失败 return "({'error':1})"; } }