package com.mes.userinfo.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.common.utils.JwtUtil; import com.mes.common.utils.RedisUtil; import com.mes.menu.mapper.SysMenuMapper; import com.mes.userinfo.entity.LoginUser; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.mapper.SysUserMapper; import com.mes.userinfo.service.SysUserService; import com.mes.utils.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Objects; /** *

* 用户表 服务实现类 *

* * @author zhoush * @since 2024-04-11 */ @Service public class SysUserServiceImpl extends ServiceImpl implements SysUserService, UserDetailsService { @Autowired private AuthenticationManager authenticationManager; @Autowired private RedisUtil redisUtil; @Resource private SysMenuMapper sysMenuMapper; @Override public Result login(SysUser user) { UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword()); Authentication authenticate = authenticationManager.authenticate(authenticationToken); if (Objects.isNull(authenticate)) { throw new RuntimeException("用户名或密码错误"); } //使用userid生成token LoginUser loginUser = (LoginUser) authenticate.getPrincipal(); String userId = loginUser.getUser().getId().toString(); String jwt = JwtUtil.generateToken(userId); //authenticate存入redis redisUtil.setCacheObject("login:" + userId, loginUser); //把token响应给前端 HashMap map = new HashMap<>(); map.put("token", jwt); return Result.success(map); } @Override public Result logout() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); Long userid = loginUser.getUser().getId(); redisUtil.deleteObject("login:" + userid); return Result.success("退出成功"); } @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(SysUser::getUserName, username); SysUser user = this.baseMapper.selectOne(lqw); //判断是否为空 if (Objects.isNull(user)) { throw new RuntimeException("用户名或密码错误"); } //查询权限信息 List perms = sysMenuMapper.selectPermsByUserId(user.getId()); return new LoginUser(user, perms); } }