From 7b8eeaf48ee268bb80e3f8161e55bb4bc2863bbf Mon Sep 17 00:00:00 2001 From: wangtianba <111@qq.com> Date: Wed, 21 Sep 2022 14:48:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/interceptor/LoginInterceptor.java | 69 +++++++++++++++++++ .../config/interceptor/PetHomeMvcConfig.java | 35 ++++++++++ .../org/controller/LoginController.java | 48 +++++++++++++ .../java/cn/itsource/org/domain/Employee.java | 2 + .../java/cn/itsource/org/dto/LoginDto.java | 15 ++++ .../itsource/org/mapper/EmployeeMapper.java | 1 + .../cn/itsource/org/mapper/UserMapper.java | 5 ++ .../org/service/IEmployeeService.java | 4 ++ .../cn/itsource/org/service/IUserService.java | 2 + .../org/service/impl/EmployeeServiceImpl.java | 53 +++++++++++++- .../org/service/impl/UserServiceImpl.java | 39 +++++++++++ src/main/java/cn/itsource/org/vo/LoginVo.java | 17 +++++ 12 files changed, 289 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/itsource/config/interceptor/LoginInterceptor.java create mode 100644 src/main/java/cn/itsource/config/interceptor/PetHomeMvcConfig.java create mode 100644 src/main/java/cn/itsource/org/controller/LoginController.java create mode 100644 src/main/java/cn/itsource/org/dto/LoginDto.java create mode 100644 src/main/java/cn/itsource/org/vo/LoginVo.java diff --git a/src/main/java/cn/itsource/config/interceptor/LoginInterceptor.java b/src/main/java/cn/itsource/config/interceptor/LoginInterceptor.java new file mode 100644 index 0000000..1625232 --- /dev/null +++ b/src/main/java/cn/itsource/config/interceptor/LoginInterceptor.java @@ -0,0 +1,69 @@ +package cn.itsource.config.interceptor; + +import cn.hutool.core.util.StrUtil; +import cn.itsource.basic.util.AjaxResult; +import cn.itsource.basic.util.PetConstant; +import cn.itsource.basic.util.RedisService; +import cn.itsource.org.vo.LoginVo; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ResourceBundle; + +@Component //spring管理 +public class LoginInterceptor implements HandlerInterceptor { + + @Autowired + private RedisService redisService; + + /** + * 进入目标方法(Controller的方法)之前之前,false:拦截 true:放行 + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + //告诉浏览器我返回的数据按json来解析 + response.setContentType("application/json;charset=utf-8"); + + //1.从request获取token信息 + String token = request.getHeader("token"); + //2.如果token不存在,重新登录 + if (StrUtil.isBlank(token)){ + return extracted(response); + } + //3.拿到token,从redis里面获取登录信息 + LoginVo vo = redisService.getKeyObjectValue(token, LoginVo.class); + + //3.1如果没有获取到,重新登录 + if (vo == null){ + //ALT+SHIFT+M + return extracted(response); + } + + //4.重点:一定要刷新redis的登录信息,重新计时30min + redisService.setStringKeyAndValue(token,vo,30); + return true; + } + + /** + * 登录错误的公共返回 + * @param response + * @return + * @throws IOException + */ + private boolean extracted(HttpServletResponse response) throws IOException { + PrintWriter writer = response.getWriter(); + //1001 + AjaxResult loginResult = AjaxResult.createError(PetConstant.SYSTEM_LOGIN_TIMOUT, "给劳资去登录"); + + writer.write(JSONObject.toJSONString(loginResult)); + //拦截 + return false; + } +} diff --git a/src/main/java/cn/itsource/config/interceptor/PetHomeMvcConfig.java b/src/main/java/cn/itsource/config/interceptor/PetHomeMvcConfig.java new file mode 100644 index 0000000..4cbc471 --- /dev/null +++ b/src/main/java/cn/itsource/config/interceptor/PetHomeMvcConfig.java @@ -0,0 +1,35 @@ +package cn.itsource.config.interceptor; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 声明这个springmvc的配置 + */ +@Configuration +public class PetHomeMvcConfig implements WebMvcConfigurer { + + @Autowired + private LoginInterceptor loginInterceptor; + + /** + * 注册拦截器 + * + * @param registry + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + //管理拦截器 + registry.addInterceptor(loginInterceptor) + .addPathPatterns("/**") //拦截所有 + .excludePathPatterns("/**/login", "/shop/settlement", "/file/**" + , "/user/**")//放行 + .excludePathPatterns("/swagger-resources/**" + , "/webjars/**" + , "/v2/**" + , "/swagger-ui.html/**");//放行swagger + + } +} diff --git a/src/main/java/cn/itsource/org/controller/LoginController.java b/src/main/java/cn/itsource/org/controller/LoginController.java new file mode 100644 index 0000000..0d8d8c6 --- /dev/null +++ b/src/main/java/cn/itsource/org/controller/LoginController.java @@ -0,0 +1,48 @@ +package cn.itsource.org.controller; + +import cn.itsource.basic.util.AjaxResult; +import cn.itsource.org.dto.LoginDto; +import cn.itsource.org.service.IEmployeeService; +import cn.itsource.org.service.IUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class LoginController { + + @Autowired + private IEmployeeService employeeService; + + @Autowired + private IUserService userService; + + /** + * 后台登录 + * @param loginDto + * @return + */ + @PostMapping("/system/login") + public AjaxResult login(@RequestBody LoginDto loginDto){ + + //登录业务 + return employeeService.login(loginDto); + } + + /** + * 用户系统登录 + * @param loginDto + * @return + */ + @PostMapping("/user/login") + public AjaxResult userLogin(@RequestBody LoginDto loginDto){ + + + //登录业务 + return userService.login(loginDto); + } + + +} diff --git a/src/main/java/cn/itsource/org/domain/Employee.java b/src/main/java/cn/itsource/org/domain/Employee.java index eec63c8..13e1610 100644 --- a/src/main/java/cn/itsource/org/domain/Employee.java +++ b/src/main/java/cn/itsource/org/domain/Employee.java @@ -51,5 +51,7 @@ public class Employee extends BaseDomain implements CreatePassword { private Long parentId; //经理id private Long managerId; + //头像 + private String headImg; } diff --git a/src/main/java/cn/itsource/org/dto/LoginDto.java b/src/main/java/cn/itsource/org/dto/LoginDto.java new file mode 100644 index 0000000..e77ad8a --- /dev/null +++ b/src/main/java/cn/itsource/org/dto/LoginDto.java @@ -0,0 +1,15 @@ +package cn.itsource.org.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LoginDto { + + //用户名 + private String username; + + //密码 + private String password; +} diff --git a/src/main/java/cn/itsource/org/mapper/EmployeeMapper.java b/src/main/java/cn/itsource/org/mapper/EmployeeMapper.java index 309fcef..ce2cf0d 100644 --- a/src/main/java/cn/itsource/org/mapper/EmployeeMapper.java +++ b/src/main/java/cn/itsource/org/mapper/EmployeeMapper.java @@ -2,6 +2,7 @@ package cn.itsource.org.mapper; import cn.itsource.basic.basicmapper.BasicMapper; import cn.itsource.org.domain.Employee; +import cn.itsource.org.dto.LoginDto; import org.apache.ibatis.annotations.Select; import tk.mybatis.mapper.entity.Example; diff --git a/src/main/java/cn/itsource/org/mapper/UserMapper.java b/src/main/java/cn/itsource/org/mapper/UserMapper.java index a0bc9ce..16c481e 100644 --- a/src/main/java/cn/itsource/org/mapper/UserMapper.java +++ b/src/main/java/cn/itsource/org/mapper/UserMapper.java @@ -2,6 +2,8 @@ package cn.itsource.org.mapper; import cn.itsource.basic.basicmapper.BasicMapper; import cn.itsource.org.domain.User; +import cn.itsource.org.dto.LoginDto; +import org.apache.ibatis.annotations.Select; import tk.mybatis.mapper.entity.Example; public interface UserMapper extends BasicMapper { @@ -17,4 +19,7 @@ public interface UserMapper extends BasicMapper { //查询 return this.selectOneByExample(example); } + + @Select("select * from t_user where username = #{username} or email = #{username} or phone = #{username}") + User findByUsername(LoginDto loginDto); } diff --git a/src/main/java/cn/itsource/org/service/IEmployeeService.java b/src/main/java/cn/itsource/org/service/IEmployeeService.java index 239c86c..dd47e29 100644 --- a/src/main/java/cn/itsource/org/service/IEmployeeService.java +++ b/src/main/java/cn/itsource/org/service/IEmployeeService.java @@ -1,8 +1,10 @@ package cn.itsource.org.service; import cn.itsource.basic.service.IBaseService; +import cn.itsource.basic.util.AjaxResult; import cn.itsource.basic.util.PageList; import cn.itsource.org.domain.Employee; +import cn.itsource.org.dto.LoginDto; import cn.itsource.org.query.EmployeeQuery; import java.util.List; @@ -19,4 +21,6 @@ public interface IEmployeeService extends IBaseService { Employee checkRepeatEmployee(Employee admin); + + AjaxResult login(LoginDto loginDto); } diff --git a/src/main/java/cn/itsource/org/service/IUserService.java b/src/main/java/cn/itsource/org/service/IUserService.java index d2433b8..da75d5c 100644 --- a/src/main/java/cn/itsource/org/service/IUserService.java +++ b/src/main/java/cn/itsource/org/service/IUserService.java @@ -3,6 +3,7 @@ package cn.itsource.org.service; import cn.itsource.basic.service.IBaseService; import cn.itsource.basic.util.AjaxResult; import cn.itsource.org.domain.User; +import cn.itsource.org.dto.LoginDto; import cn.itsource.org.query.UserQuery; import javax.servlet.http.HttpServletRequest; @@ -16,4 +17,5 @@ public interface IUserService extends IBaseService { AjaxResult registerUser(User user); + AjaxResult login(LoginDto loginDto); } diff --git a/src/main/java/cn/itsource/org/service/impl/EmployeeServiceImpl.java b/src/main/java/cn/itsource/org/service/impl/EmployeeServiceImpl.java index 564b21d..249f256 100644 --- a/src/main/java/cn/itsource/org/service/impl/EmployeeServiceImpl.java +++ b/src/main/java/cn/itsource/org/service/impl/EmployeeServiceImpl.java @@ -1,26 +1,76 @@ package cn.itsource.org.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.MD5; import cn.itsource.basic.service.impl.BaseServiceImpl; +import cn.itsource.basic.util.AjaxResult; import cn.itsource.basic.util.PageList; +import cn.itsource.basic.util.RedisService; +import cn.itsource.config.exception.BusinessException; import cn.itsource.org.domain.Employee; +import cn.itsource.org.dto.LoginDto; import cn.itsource.org.mapper.EmployeeMapper; import cn.itsource.org.query.EmployeeQuery; import cn.itsource.org.service.IEmployeeService; import cn.itsource.org.service.IEmployeeService; +import cn.itsource.org.vo.LoginVo; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.sql.Struct; import java.util.List; @Service //spring管理 public class EmployeeServiceImpl extends BaseServiceImpl implements IEmployeeService { + //普通crud通过继承得到 @Autowired private EmployeeMapper employeeMapper; - //普通crud通过继承得到 + @Autowired + private RedisService redisService; + + + @Override + public AjaxResult login(LoginDto loginDto) { + + //1.验证参数 @NotBlack + + //2.根据用户名进行匹配 //账户名与密码不匹配,请重新输入 + Employee employee = BeanUtil.copyProperties(loginDto, Employee.class); + Employee dbEmployee = employeeMapper.checkRepeatEmployee(employee); + + //3.如果匹配不到,返回错误 + if (dbEmployee == null){ + throw new BusinessException("账户名与密码不匹配,请重新输入"); + } + //4.如果匹配到了,对进来的密码串加盐加密和数据库的加密串进行比对, + //4.1拿到数据库的盐值,再对页面传递过来的密码进行加密 + String pageMd5Pwd = MD5.create().setSalt(dbEmployee.getSalt().getBytes()).digestHex(loginDto.getPassword()); + + //5.比对不过,返回错误 pageMd5Pwd:页面密码加密串 dbEmployee.getPassword():数据库的加密串 + if (!StrUtil.equals(pageMd5Pwd,dbEmployee.getPassword())){ + throw new BusinessException("账户名与密码不匹配,请重新输入"); + } + + //6.成功,存放redis.setKv(token,用户信息,时间) + String token = IdUtil.fastSimpleUUID(); + //6.1封装成一个通用对象,用户系统和后台系统都可以用这个 + LoginVo loginVo = BeanUtil.copyProperties(dbEmployee, LoginVo.class); + loginVo.setToken(token); + + redisService.setStringKeyAndValue(token,loginVo,30); + //7.返回vo对象,vo专门用来返回值给前端页面的 + return AjaxResult.createSuccess(loginVo); + + } + + @Override public List findManagers() { @@ -32,4 +82,5 @@ public class EmployeeServiceImpl extends BaseServiceImpl return employeeMapper.checkRepeatEmployee(admin); } + } diff --git a/src/main/java/cn/itsource/org/service/impl/UserServiceImpl.java b/src/main/java/cn/itsource/org/service/impl/UserServiceImpl.java index 060f83c..6f54cc5 100644 --- a/src/main/java/cn/itsource/org/service/impl/UserServiceImpl.java +++ b/src/main/java/cn/itsource/org/service/impl/UserServiceImpl.java @@ -1,17 +1,22 @@ package cn.itsource.org.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.MD5; import cn.itsource.basic.service.impl.BaseServiceImpl; import cn.itsource.basic.util.AjaxResult; import cn.itsource.basic.util.RedisService; import cn.itsource.basic.util.SendMessageService; import cn.itsource.config.exception.BusinessException; import cn.itsource.org.domain.User; +import cn.itsource.org.dto.LoginDto; import cn.itsource.org.mapper.UserMapper; import cn.itsource.org.query.UserQuery; import cn.itsource.org.service.IUserService; +import cn.itsource.org.vo.LoginVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +44,38 @@ public class UserServiceImpl extends BaseServiceImpl implements private SendMessageService sendMessageService; + @Override + public AjaxResult login(LoginDto loginDto) { + + //1.去t_user表匹配账户 + User dbUser = userMapper.findByUsername(loginDto); + + //2.如果user不存在,返回提示 + if (dbUser == null){ + throw new BusinessException("账户密码不匹配"); + } + + //4.如果匹配到了,对进来的密码串加盐加密和数据库的加密串进行比对, + //4.1拿到数据库的盐值,再对页面传递过来的密码进行加密 + String pageMd5Pwd = MD5.create().setSalt(dbUser.getSalt().getBytes()).digestHex(loginDto.getPassword()); + + //5.比对不过,返回错误 pageMd5Pwd:页面密码加密串 dbEmployee.getPassword():数据库的加密串 + if (!StrUtil.equals(pageMd5Pwd,dbUser.getPassword())){ + throw new BusinessException("账户名与密码不匹配,请重新输入"); + } + + //6.成功,存放redis.setKv(token,用户信息,时间) + String token = IdUtil.fastSimpleUUID(); + //6.1封装成一个通用对象,用户系统和后台系统都可以用这个 + LoginVo loginVo = BeanUtil.copyProperties(dbUser, LoginVo.class); + loginVo.setToken(token); + + redisService.setStringKeyAndValue(token,loginVo,30); + //7.返回vo对象,vo专门用来返回值给前端页面的 + return AjaxResult.createSuccess(loginVo); + + } + @Override public AjaxResult checkPhone(String phone) { //1.验证手机号合法性 @@ -141,6 +178,8 @@ public class UserServiceImpl extends BaseServiceImpl implements return AjaxResult.createSuccess(); } + + public static void main(String[] args) { log.info("[宠物乐园验证码]:{},手机号:{}","111","17736565658");//推荐 diff --git a/src/main/java/cn/itsource/org/vo/LoginVo.java b/src/main/java/cn/itsource/org/vo/LoginVo.java new file mode 100644 index 0000000..d9e1b9d --- /dev/null +++ b/src/main/java/cn/itsource/org/vo/LoginVo.java @@ -0,0 +1,17 @@ +package cn.itsource.org.vo; + +import lombok.Data; + +/** + * 兼容用户系统和后台系统的公共登录对象 + */ +@Data +public class LoginVo { + + private String username; //用户名 + private String email;//邮箱 + private String phone;//手机号 + private String headImg;//头像 + private String token;//登录令牌 + +} -- Gitee