You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

138 lines
4.5 KiB

/**
* 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.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 JwtUtils jwtUtils;
@Autowired
private JwtProperties jwtProperties;
@Override
public AuthorizationDTO login(LoginDTO login) {
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
//获取用户信息
Result<UserDetail> 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());
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());
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());
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());
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());
userDetailRedis.logout(userId);
}
}