forked from kidgrow-microservices-platform

zhaoxiaohao
2020-04-20 6ec40d5a0c145ccffd1a28841f1c732f764e3e44
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.kidgrow.common.resolver;
 
import cn.hutool.core.util.StrUtil;
import com.kidgrow.common.annotation.LoginUser;
import com.kidgrow.common.constant.SecurityConstants;
import com.kidgrow.common.feign.UserService;
import com.kidgrow.common.model.SysRole;
import com.kidgrow.common.model.SysUser;
import com.kidgrow.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
 
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
/**
 * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
 *
 * @Description: Token转SysUser<br>
 * @Project: <br>
 * @CreateDate: Created in 2020/2/3 16:13 <br>
 * @Author: <a href="4345453@kidgrow.com">liuke</a>
 */
@Slf4j
//@Component
public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
    private UserService userService;
 
    public TokenArgumentResolver(UserService userService) {
        this.userService = userService;
    }
 
    /**
     * 入参筛选
     *
     * @param methodParameter 参数集合
     * @return 格式化后的参数
     */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(LoginUser.class) && methodParameter.getParameterType().equals(SysUser.class);
    }
 
    /**
     * @param methodParameter       入参集合
     * @param modelAndViewContainer model 和 view
     * @param nativeWebRequest      web相关
     * @param webDataBinderFactory  入参解析
     * @return 包装对象
     */
    @Override
    public Object resolveArgument(MethodParameter methodParameter,
                                  ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest,
                                  WebDataBinderFactory webDataBinderFactory) {
        LoginUser loginUser = methodParameter.getParameterAnnotation(LoginUser.class);
        boolean isFull = loginUser.isFull();
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        String userId = request.getHeader(SecurityConstants.USER_ID_HEADER);
        String username = request.getHeader(SecurityConstants.USER_HEADER);
        String roles = request.getHeader(SecurityConstants.ROLE_HEADER);
        if (StrUtil.isBlank(username)) {
            log.warn("resolveArgument error username is empty");
            return null;
        }
        SysUser user;
        if (isFull) {
            user = userService.selectByUsername(username);
        } else {
            user = new SysUser();
            user.setId(Long.valueOf(userId));
            user.setUsername(username);
        }
        List<SysRole> sysRoleList = new ArrayList<>();
        if(StringUtils.isNotBlank(roles)){
            Arrays.stream(roles.split(",")).forEach(role -> {
                SysRole sysRole = new SysRole();
                sysRole.setCode(role);
                sysRoleList.add(sysRole);
            });
        }
        user.setRoles(sysRoleList);
        return user;
    }
}