guns多租户支持bug处理

    今日研究guns开源框架的多租户功能的时候发现存在bug。租户建立成功,前端登录之后不能正常进入主页,研究之后发现是由于现有的默认服务端框架中在执行接口时未根据用户信息进行租户的数据源切换操作,造成在租户进入的情况下,还是访问主数据源的数据库。
    修改方案为,在过滤器中直接进行数据源的切换工作。
具体操作为修改AuthJwtTokenSecurityInterceptor中的filterAction函数,增加切换数据源相关代码。

package cn.stylefeng.guns.core.security;

import cn.hutool.core.util.StrUtil;
import cn.stylefeng.guns.core.security.base.BaseSecurityInterceptor;
import cn.stylefeng.roses.kernel.auth.api.AuthServiceApi;
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.dsctn.api.constants.DatasourceContainerConstants;
import cn.stylefeng.roses.kernel.dsctn.api.context.CurrentDataSourceContext;
import cn.stylefeng.roses.kernel.saas.api.SaasTenantApi;
import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceDefinition;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 鉴权的过滤器,用来鉴权token
 *
 * @author fengshuonan
 * @date 2020/12/15 22:45
 */
@Component
@Slf4j
public class AuthJwtTokenSecurityInterceptor extends BaseSecurityInterceptor {

    /**
     * 登陆服务Api
     */
    @Resource
    private AuthServiceApi authServiceApi;
    @Resource
    private SessionManagerApi sessionManagerApi;
    @Resource
    private SaasTenantApi saasTenantApi;
    @Override
    public void filterAction(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, ResourceDefinition resourceDefinition, String token) {

        // 1. 获取当前请求的路径
        String requestURI = httpServletRequest.getRequestURI();

        // 2. 如果需要登录
        if (resourceDefinition.getRequiredLoginFlag()) {

            // token为空,返回用户校验失败
            if (StrUtil.isEmpty(token)) {
                throw new AuthException(AuthExceptionEnum.TOKEN_GET_ERROR);
            }

            // 3.校验token和用户会话信息是否正确
            authServiceApi.checkAuth(token, requestURI);
            //by stylefeng 根据登录用户的租户信息进行数据源的切换
            LoginUser session = sessionManagerApi.getSession(token);
            if (session != null) {
                if (StringUtils.hasLength(session.getTenantCode()) && !DatasourceContainerConstants.MASTER_DATASOURCE_NAME.equals(session.getTenantCode())) {
                    saasTenantApi.changeTenant(session.getTenantCode());
                }
            }
        }
    }

}


这里需要注意:
if (StringUtils.hasLength(session.getTenantCode()) && !DatasourceContainerConstants.MASTER_DATASOURCE_NAME.equals(session.getTenantCode())) 。
刚开始由于没有判断主数据源直接进行数据源切换,造成在非租户登录模式下异常。
后来查询了代码,发现在租户登录模式下,TenantServiceImpl进行了数据源判断处理了。

        // 如果请求租户编码是master,走正常登录
        if (DatasourceContainerConstants.MASTER_DATASOURCE_NAME.equals(tenantRequest.getTenantCode())) {
            tenantRequest.setTenantCode(null);
            return authServiceApi.login(tenantRequest);
        }

为了尽量不改底层代码,因此没有去东kernel-d-auth的login代码,而在过滤器切换数据源的时候进行了数据源判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值