package com.nms.swspkmas_standalone.service.impl; import cn.hutool.crypto.digest.MD5; import com.nms.swspkmas_standalone.entity.User; import com.nms.swspkmas_standalone.entity.vo.AccountVO; import com.nms.swspkmas_standalone.exception.ApiException; import com.nms.swspkmas_standalone.filter.JwtFilter; import com.nms.swspkmas_standalone.service.AccountService; import com.nms.swspkmas_standalone.utils.JwtTokenUtil; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.subject.Subject; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @Service public class AccountServiceImpl implements AccountService { @Override public AccountVO login(AccountVO accountVO) { String userName = accountVO.getUsername(); String password = accountVO.getPassword(); // 获取当前用户主体 Subject subject = SecurityUtils.getSubject(); String msg ; // 将用户名和密码封装成 UsernamePasswordToken 对象 UsernamePasswordToken token = new UsernamePasswordToken(userName, password); try { subject.login(token); Object principal = subject.getPrincipal(); User user = (User) principal; AccountVO acc = new AccountVO(); BeanUtils.copyProperties(user, acc,new String[]{"password"}); // 若登录成功,签发 JWT token String jwtToken = JwtTokenUtil.generateToken(userName); acc.setToken(jwtToken); JwtFilter.tokenMap.put(MD5.create().digestHex(jwtToken), jwtToken); return acc; } catch (UnknownAccountException | IncorrectCredentialsException uae) { // 账号不存在 throw new ApiException("用户名/密码错误,请重新输入"); } // 账号与密码不匹配 catch (LockedAccountException lae) { // 账号已被锁定 msg = "用户名/密码错误,请重新输入"; throw new ApiException(msg); } catch (AuthenticationException ae) { // 其他身份验证异常 msg = "用户名/密码错误,请重新输入"; throw new ApiException(msg); } } }