package com.ycl.jxkg.config.spring.security; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.jxkg.base.SystemCode; import com.ycl.jxkg.constants.CaffeineConstant; import com.ycl.jxkg.domain.entity.SysConfig; import com.ycl.jxkg.domain.entity.UserEventLog; import com.ycl.jxkg.domain.vo.student.user.UserLoginVO; import com.ycl.jxkg.enums.general.YesOrNoEnum; import com.ycl.jxkg.event.UserEvent; import com.ycl.jxkg.mapper.ClassesUserMapper; import com.ycl.jxkg.mapper.SysConfigMapper; import com.ycl.jxkg.service.UserService; import com.ycl.jxkg.utils.CaffeineUtil; import com.ycl.jxkg.utils.DateTimeUtil; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.User; import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; import java.util.List; /** * @version 3.5.0 * @description: 登录成功返回 * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司 * @date 2021/12/25 9:45 */ @Component public class RestAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { private final ApplicationEventPublisher eventPublisher; private final UserService userService; private final CaffeineUtil caffeineUtil; private final SysConfigMapper sysConfigMapper; @Autowired private ClassesUserMapper classesUserMapper; /** * Instantiates a new Rest authentication success handler. * * @param eventPublisher the event publisher * @param userService the user service */ @Autowired public RestAuthenticationSuccessHandler(ApplicationEventPublisher eventPublisher, UserService userService, CaffeineUtil caffeineUtil, SysConfigMapper sysConfigMapper) { this.eventPublisher = eventPublisher; this.userService = userService; this.caffeineUtil = caffeineUtil; this.sysConfigMapper = sysConfigMapper; } @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { Object object = authentication.getPrincipal(); if (null != object) { User springUser = (User) object; // 登录之后保存或更新 用户名与session的关系 String sessionId = request.getSession().getId(); caffeineUtil.put(CaffeineConstant.AUTH, springUser.getUsername(), sessionId); com.ycl.jxkg.domain.entity.User user = userService.getUserByUserName(springUser.getUsername()); if (null != user) { List configList = new LambdaQueryChainWrapper<>(sysConfigMapper) .list(); Integer passwordExpireDays = 30; if (configList.size() == 1) { passwordExpireDays = configList.get(0).getPasswordExpireTime(); } Date now = new Date(); // 密码过期返回强制修改密码标识 if (DateTimeUtil.getTwoTimeDiffDay(now, user.getLastUpdatePasswordTime()) > passwordExpireDays) { RestUtil.response(response, 205, "密码过期,请修改密码", user.getId()); return; } UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date()); userEventLog.setContent(user.getUserName() + " 登录了江西语音视频培训系统"); eventPublisher.publishEvent(new UserEvent(userEventLog)); UserLoginVO userLoginVO = new UserLoginVO(); BeanUtils.copyProperties(user,userLoginVO); List classesNames = classesUserMapper.getClassesNameByUserId(user.getId()); userLoginVO.setClassName(classesNames); RestUtil.response(response, SystemCode.OK.getCode(), SystemCode.OK.getMessage(), userLoginVO); } } else { RestUtil.response(response, SystemCode.UNAUTHORIZED.getCode(), SystemCode.UNAUTHORIZED.getMessage()); } } }