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
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);
|
|
}
|
|
|
|
}
|
|
|