/shop-sso/src/main/java/org/shop/sso/service/impl/UserServiceImpl.java

https://github.com/Tang-Cong/shop · Java · 185 lines · 122 code · 19 blank · 44 comment · 26 complexity · a314fa48be935b94a5c850eafbaff69f MD5 · raw file

  1. package org.shop.sso.service.impl;
  2. import java.util.Date;
  3. import java.util.List;
  4. import java.util.UUID;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.apache.commons.lang3.StringUtils;
  8. import org.shop.common.pojo.TaotaoResult;
  9. import org.shop.common.utils.CookieUtils;
  10. import org.shop.common.utils.JsonUtils;
  11. import org.shop.manager.dao.TbUserMapper;
  12. import org.shop.manager.pojo.TbUser;
  13. import org.shop.manager.pojo.TbUserExample;
  14. import org.shop.manager.pojo.TbUserExample.Criteria;
  15. import org.shop.sso.dao.JedisClient;
  16. import org.shop.sso.service.UserService;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.util.DigestUtils;
  21. /**
  22. * 用户管理Service
  23. */
  24. @Service
  25. public class UserServiceImpl implements UserService {
  26. @Autowired
  27. private TbUserMapper userMapper;
  28. @Autowired
  29. private JedisClient jedisClient;
  30. @Value("${REDIS_USER_SESSION_KEY}")
  31. private String REDIS_USER_SESSION_KEY;
  32. @Value("${SSO_SESSION_EXPIRE}")
  33. private Integer SSO_SESSION_EXPIRE;
  34. @Override
  35. public TaotaoResult checkData(String content, Integer type) {
  36. // 创建查询条件
  37. TbUserExample example = new TbUserExample();
  38. Criteria criteria = example.createCriteria();
  39. // 对数据进行校验:1、2、3分别代表username、phone、email
  40. // 用户名校验
  41. if (1 == type) {
  42. criteria.andUsernameEqualTo(content);
  43. // 电话校验
  44. } else if (2 == type) {
  45. criteria.andPhoneEqualTo(content);
  46. // email校验
  47. } else {
  48. criteria.andEmailEqualTo(content);
  49. }
  50. // 执行查询
  51. List<TbUser> list = userMapper.selectByExample(example);
  52. if (list == null || list.size() == 0) {
  53. return TaotaoResult.ok(true);
  54. }
  55. return TaotaoResult.ok(false);
  56. }
  57. @Override
  58. public TaotaoResult createUser(TbUser user) {
  59. if (StringUtils.isBlank(user.getUsername())
  60. || StringUtils.isBlank(user.getPassword())) {
  61. return TaotaoResult.build(400, "用户名或密码不能为空");
  62. }
  63. // 校验数据是否重复
  64. // 校验用户名
  65. TaotaoResult result = checkData(user.getUsername(), 1);
  66. if (!(boolean) result.getData()) {
  67. return TaotaoResult.build(400, "用户名重复");
  68. }
  69. // 校验手机号
  70. if (user.getPhone() != null) {
  71. result = checkData(user.getPhone(), 2);
  72. if (!(boolean) result.getData()) {
  73. return TaotaoResult.build(400, "手机号重复");
  74. }
  75. }
  76. // 校验邮箱
  77. if (user.getEmail() != null) {
  78. result = checkData(user.getEmail(), 3);
  79. if (!(boolean) result.getData()) {
  80. return TaotaoResult.build(400, "邮箱重复");
  81. }
  82. }
  83. user.setUpdated(new Date());
  84. user.setCreated(new Date());
  85. // md5加密
  86. user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword()
  87. .getBytes()));
  88. userMapper.insert(user);
  89. return TaotaoResult.ok();
  90. }
  91. /**
  92. * 用户登录
  93. * <p>
  94. * Title: userLogin
  95. * </p>
  96. * <p>
  97. * Description:
  98. * </p>
  99. *
  100. * @param username
  101. * @param password
  102. * @return
  103. * @see com.taotao.sso.service.UserService#userLogin(java.lang.String,
  104. * java.lang.String)
  105. */
  106. @Override
  107. public TaotaoResult userLogin(String username, String password,
  108. HttpServletRequest request, HttpServletResponse response) {
  109. TbUserExample example = new TbUserExample();
  110. Criteria criteria = example.createCriteria();
  111. criteria.andUsernameEqualTo(username);
  112. List<TbUser> list = userMapper.selectByExample(example);
  113. // 如果没有此用户名
  114. if (null == list || list.size() == 0) {
  115. return TaotaoResult.build(400, "用户名或密码错误");
  116. }
  117. TbUser user = list.get(0);
  118. // 比对密码
  119. if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(
  120. user.getPassword())) {
  121. return TaotaoResult.build(400, "用户名或密码错误");
  122. }
  123. // 生成token
  124. String token = UUID.randomUUID().toString();
  125. // 保存用户之前,把用户对象中的密码清空。
  126. user.setPassword(null);
  127. // 把用户信息写入redis
  128. jedisClient.set(REDIS_USER_SESSION_KEY + ":" + token,
  129. JsonUtils.objectToJson(user));
  130. // 设置session的过期时间
  131. jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token,
  132. SSO_SESSION_EXPIRE);
  133. // 添加写cookie的逻辑,cookie的有效期是关闭浏览器就失效。
  134. CookieUtils.setCookie(request, response, "TT_TOKEN", token);
  135. // 返回token
  136. return TaotaoResult.ok(token);
  137. }
  138. @Override
  139. public TaotaoResult getUserByToken(String token) {
  140. // 根据token从redis中查询用户信息
  141. String json = jedisClient.get(REDIS_USER_SESSION_KEY + ":" + token);
  142. // 判断是否为空
  143. if (StringUtils.isBlank(json)) {
  144. return TaotaoResult.build(400, "此session已经过期,请重新登录");
  145. }
  146. // 更新过期时间
  147. jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token,
  148. SSO_SESSION_EXPIRE);
  149. // 返回用户信息
  150. return TaotaoResult.ok(JsonUtils.jsonToPojo(json, TbUser.class));
  151. }
  152. @Override
  153. public TaotaoResult deleteToken(String token, HttpServletRequest request,
  154. HttpServletResponse response) {
  155. // 根据token从redis中查询用户信息
  156. String json = jedisClient.get(REDIS_USER_SESSION_KEY + ":" + token);
  157. // 判断是否为空
  158. if (StringUtils.isBlank(json)) {
  159. return TaotaoResult.build(400, "此session已经过期,请重新登录");
  160. }
  161. jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, 0);
  162. CookieUtils.deleteCookie(request, response, "TT_TOKEN");
  163. // 返回用户信息
  164. return TaotaoResult.ok();
  165. }
  166. }