kongzy
2023-09-22 3124f3a5b7f45d043b228829b6b3a2e541b31574
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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);
        }
    }
}