SpringCloud微服务实战——搭建企业级开发框架(二十二):基于MybatisPlus插件TenantLineInnerInterceptor实现多租户功能 (2)

4、在GitEggAuthUtils方法中新增获取租户信息的公共方法,租户信息在Gateway进行转发时进行设置,后面会说明如何讲租户信息设置到Header中:

package com.gitegg.platform.boot.util; import cn.hutool.json.JSONUtil; import com.gitegg.platform.base.constant.AuthConstant; import com.gitegg.platform.base.domain.GitEggUser; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; public class GitEggAuthUtils { /** * 获取用户信息 * * @return GitEggUser */ public static GitEggUser getCurrentUser() { HttpServletRequest request = GitEggWebUtils.getRequest(); if (request == null) { return null; } try { String user = request.getHeader(AuthConstant.HEADER_USER); if (StringUtils.isEmpty(user)) { return null; } String userStr = URLDecoder.decode(user,"UTF-8"); GitEggUser gitEggUser = JSONUtil.toBean(userStr, GitEggUser.class); return gitEggUser; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } /** * 获取租户Id * * @return tenantId */ public static String getTenantId() { HttpServletRequest request = GitEggWebUtils.getRequest(); if (request == null) { return null; } try { String tenantId = request.getHeader(AuthConstant.TENANT_ID); String user = request.getHeader(AuthConstant.HEADER_USER); //如果请求头中的tenantId为空,那么尝试是否能够从登陆用户中去获取租户id if (StringUtils.isEmpty(tenantId) && !StringUtils.isEmpty(user)) { String userStr = URLDecoder.decode(user,"UTF-8"); GitEggUser gitEggUser = JSONUtil.toBean(userStr, GitEggUser.class); if (null != gitEggUser) { tenantId = gitEggUser.getTenantId(); } } return tenantId; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } }

5、GitEgg-Cloud工程中gitegg-gateway子工程的AuthGlobalFilter增加设置TenantId的过滤方法

String tenantId = exchange.getRequest().getHeaders().getFirst(AuthConstant.TENANT_ID); String token = exchange.getRequest().getHeaders().getFirst(AuthConstant.JWT_TOKEN_HEADER); if (StrUtil.isEmpty(tenantId) && StrUtil.isEmpty(token)) { return chain.filter(exchange); } Map<string, string=""> addHeaders = new HashMap<>(); // 如果系统配置已开启租户模式,设置tenantId if (enable && StrUtil.isEmpty(tenantId)) { addHeaders.put(AuthConstant.TENANT_ID, tenantId); }

6、以上为后台的多租户功能集成步骤,在实际项目开发过程中,我们需要考虑到前端页面在租户信息上的配置,实现思路,不用的租户拥有不同的域名,前端页面根据当前域名获取到对应的租户信息,并在公共请求方法设置TenantId参数,保证每次请求能够携带租户信息。

// request interceptor request.interceptors.request.use(config => { const token = storage.get(ACCESS_TOKEN) // 如果 token 存在 // 让每个请求携带自定义 token 请根据实际情况自行修改 if (token) { config.headers['Authorization'] = token } config.headers['TenantId'] = process.env.VUE_APP_TENANT_ID return config }, errorHandler) 源码地址: 

Gitee: https://gitee.com/wmz1930/GitEgg

GitHub: https://github.com/wmz1930/GitEgg

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxgjj.html