forked from kidgrow-microservices-platform

zhaoxiaohao
2020-05-22 f21c78ae0e3c410c6ba5be77277b5b491aca3af1
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package com.kidgrow.zuul.filter;
 
import com.alibaba.fastjson.JSON;
import com.kidgrow.common.constant.CommonConstant;
import com.kidgrow.common.constant.SecurityConstants;
import com.kidgrow.common.model.ResultBody;
import com.kidgrow.common.model.SysDoctor;
import com.kidgrow.common.model.SysOrganization;
import com.kidgrow.common.model.SysUser;
import com.kidgrow.common.utils.AddrUtil;
import com.kidgrow.zuul.feign.SysDoctorService;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import eu.bitwalker.useragentutils.UserAgent;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.stereotype.Component;
 
import javax.servlet.http.HttpServletRequest;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.FORM_BODY_WRAPPER_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
 
/**
 * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
 *
 * @Description: 将认证用户的相关信息放入header中, 后端服务可以直接读取使用     包含了----组织的拦截---<br>
 * @Project: <br>
 * @CreateDate: Created in 2020/2/21 10:12 <br>
 * @Author: <a href="4345453@kidgrow.com">liuke</a>
 */
@Slf4j
@Component
public class UserInfoHeaderFilter extends ZuulFilter {
    @Autowired
    private SysDoctorService sysDoctorService;
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }
 
    @Override
    public int filterOrder() {
        return FORM_BODY_WRAPPER_FILTER_ORDER - 1;
    }
 
    @Override
    public boolean shouldFilter() {
        return true;
    }
 
 
 
    @SneakyThrows
    @Override
    public Object run() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) {
            Object principal = authentication.getPrincipal();
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest req = ctx.getRequest();
            UserAgent userAgent = UserAgent.parseUserAgentString(req.getHeader("User-Agent"));
            String tenantId = "";
            //客户端模式只返回一个clientId
            if (principal instanceof SysUser) {
 
                SysUser user = (SysUser) authentication.getPrincipal();
                Map<String,Object> map=new HashMap<>();
                map.put("user_id",user.getId());
                ResultBody listByMap = sysDoctorService.getListByMap(map);
 
                List<SysDoctor> sysDoctors = JSON.parseArray(JSON.toJSONString(listByMap.getData()), SysDoctor.class);
                String str="";
                Long hospital=-1L;
                if(sysDoctors!=null&&sysDoctors.size()>0){
                    str= sysDoctors.get(0).getDoctorName();
                    hospital=sysDoctors.get(0).getHospitalId();
                }
                ctx.addZuulRequestHeader(SecurityConstants.USER_ID_HEADER, String.valueOf(user.getId()));
                ctx.addZuulRequestHeader(SecurityConstants.USER_HEADER, user.getUsername());
 
                ctx.addZuulRequestHeader(SecurityConstants.USER_REAL_NAME,URLEncoder.encode(str,"UTF-8"));//待完善
                ctx.addZuulRequestHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER,hospital.toString());
                tenantId=hospital.toString();
                List<SysOrganization> organizations = (List<SysOrganization>) user.getOrganizations();
                //将组织数据 存到header 里面
                organizations.sort((e1,e2)->e1.getOrgLevel().compareTo(e2.getOrgLevel()));
                if (organizations != null&&organizations.size()>0) {
                    ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_ID_HEADER,String.valueOf(organizations.get(0).getId()));
                    ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_NAME_HEADER, URLEncoder.encode(organizations.get(0).getOrgName(),"UTF-8"));
                    ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_ID_HEADER,String.valueOf(organizations.get(organizations.size()-1).getId()));
                    ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_NAME_HEADER,URLEncoder.encode(organizations.get(organizations.size()-1).getOrgName(),"UTF-8"));
                    ctx.addZuulRequestHeader(SecurityConstants.USER_ORGS_HEADER,JSON.toJSONString(organizations));
                }
                //将角色放到header
                ctx.addZuulRequestHeader(SecurityConstants.ROLE_HEADER, JSON.toJSONString(user.getRoles()));
 
            }
 
 
            OAuth2Authentication oauth2Authentication = (OAuth2Authentication) authentication;
            String clientId = oauth2Authentication.getOAuth2Request().getClientId();
 
            //保存租户id,租户id根据业务尽进行替换
            switch (clientId) {
                case "hospital":
                    tenantId =  tenantId;
                    break;
                case "webApp":
                    tenantId = "webApp";
                    break;
                default:
                    tenantId = clientId;
                    break;
            }
            ctx.addZuulRequestHeader(CommonConstant.USER_AGENT_BROWSER, userAgent.getBrowser().toString());
            ctx.addZuulRequestHeader(CommonConstant.USER_AGENT_SYSTEM, userAgent.getOperatingSystem().toString());
            ctx.addZuulRequestHeader(CommonConstant.USER_AGENT_IP, AddrUtil.getRemoteAddr(req));
 
//            UserAgentContextHolder.setUserAgent(AddrUtil.getRemoteAddr(req)+"kidgrow"+userAgent.getBrowser().toString()+"kidgrow"+userAgent.getOperatingSystem().toString());
 
            ctx.addZuulRequestHeader(SecurityConstants.TENANT_HEADER, tenantId);
            ctx.addZuulRequestHeader(SecurityConstants.CLIENT_HEADER, clientId);
 
        }
        return null;
    }
}