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