/** * Copyright (c) 2018 人人开源 All rights reserved. * * https://www.renren.io * * 版权所有,侵权必究! */ package com.epmet.service.impl; import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.log.SysLogLogin; import com.epmet.commons.tools.log.enums.LogTypeEnum; import com.epmet.commons.tools.log.enums.LoginOperationEnum; import com.epmet.commons.tools.log.enums.LoginStatusEnum; import com.epmet.commons.tools.log.producer.LogProducer; import com.epmet.commons.tools.redis.UserDetailRedis; import com.epmet.commons.tools.security.password.PasswordUtils; import com.epmet.commons.tools.security.user.SecurityUser; import com.epmet.commons.tools.security.user.UserDetail; import com.epmet.commons.tools.utils.HttpContextUtils; import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.AuthorizationDTO; import com.epmet.dto.LoginDTO; import com.epmet.enums.UserStatusEnum; import com.epmet.feign.UserFeignClient; import com.epmet.jwt.JwtProperties; import com.epmet.jwt.JwtUtils; import com.epmet.service.AuthService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.Date; /** * 认证服务 * * @author Mark sunlightcs@gmail.com * @since 1.0.0 */ @Service public class AuthServiceImpl implements AuthService { @Autowired private UserFeignClient userFeignClient; @Autowired private UserDetailRedis userDetailRedis; @Autowired private LogProducer logProducer; @Autowired private JwtUtils jwtUtils; @Autowired private JwtProperties jwtProperties; @Override public AuthorizationDTO login(LoginDTO login) { HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); //获取用户信息 Result result = userFeignClient.getByUsername(login.getUsername()); UserDetail user = result.getData(); //登录日志 SysLogLogin log = new SysLogLogin(); log.setType(LogTypeEnum.LOGIN.value()); log.setOperation(LoginOperationEnum.LOGIN.value()); log.setCreateDate(new Date()); log.setIp(IpUtils.getIpAddr(request)); log.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT)); log.setIp(IpUtils.getIpAddr(request)); //账号不存在 if(user == null){ log.setStatus(LoginStatusEnum.FAIL.value()); log.setCreatorName(login.getUsername()); logProducer.saveLog(log); throw new RenException(ErrorCode.ACCOUNT_PASSWORD_ERROR); } //密码错误 if(!PasswordUtils.matches(login.getPassword(), user.getPassword())){ log.setStatus(LoginStatusEnum.FAIL.value()); log.setCreator(user.getId()); log.setCreatorName(user.getUsername()); logProducer.saveLog(log); throw new RenException(ErrorCode.ACCOUNT_PASSWORD_ERROR); } //账号停用 if(user.getStatus() == UserStatusEnum.DISABLE.value()){ log.setStatus(LoginStatusEnum.LOCK.value()); log.setCreator(user.getId()); log.setCreatorName(user.getUsername()); logProducer.saveLog(log); throw new RenException(ErrorCode.ACCOUNT_DISABLE); } //保存到Redis userDetailRedis.set(user, jwtProperties.getExpire()); //登录成功,生成token String token = jwtUtils.generateToken(user.getId()); //授权信息 AuthorizationDTO authorization = new AuthorizationDTO(); authorization.setToken(token); authorization.setExpire(jwtProperties.getExpire()); //登录用户信息 log.setCreator(user.getId()); log.setCreatorName(user.getUsername()); log.setStatus(LoginStatusEnum.SUCCESS.value()); logProducer.saveLog(log); return authorization; } @Override public void logout(Long userId) { HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); UserDetail user = SecurityUser.getUser(); //退出日志 SysLogLogin log = new SysLogLogin(); log.setType(LogTypeEnum.LOGIN.value()); log.setOperation(LoginOperationEnum.LOGOUT.value()); log.setIp(IpUtils.getIpAddr(request)); log.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT)); log.setIp(IpUtils.getIpAddr(request)); log.setStatus(LoginStatusEnum.SUCCESS.value()); log.setCreator(user.getId()); log.setCreatorName(user.getUsername()); log.setCreateDate(new Date()); logProducer.saveLog(log); userDetailRedis.logout(userId); } }