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代码,而在过滤器切换数据源的时候进行了数据源判断。

Guns 文档高级版 v20191027 1. 序言1.1 文档简介 1.2 最新Guns&Roses架构视频 1.3 版本介绍 2. 使用手册 2.1 下载项目 2.1.1 下载企业版项目 2.2 导入项目 2.2.1 eclipse导入 2.2.2 IDEA导入 2.3 运行项目 2.4 打包部署 3. 开发手册 3.1 了解Guns 3.1.1 模块结构 3.1.2 包结构说明 3.2 实战开发 3.2.1 建表 3.2.2 代码生成 3.2.3 添加菜单与分配权限 3.2.4 编写业务代码 3.3 权限控制与校验 3.3.1 用户,角色和资源 3.3.2 如何对资源进行权限控制 3.3.3 前端页面对权限资源的显示 3.4 多数据源的使用 3.5 如何分页 3.5.1 简单查询的分页 3.5.2 复杂查询的分页 3.5.3 获取前端表格插件传值 3.6 数据范围 3.6.1 介绍 3.6.2 如何使用 3.6.3 原理 3.7 spring security + jwt鉴权 3.7.1 放开权限过滤 3.7.2 获取当前登录用户 3.7.3 会话管理 3.8 日志记录 3.8.1 业务日志 3.8.2 异常日志 3.9 如何使用缓存 3.10 使用枚举 3.11 spring boot热部署 3.11.1 重新加载html 3.11.2 重新加载java类 3.12 发送邮件 3.13 发送短信 4. 高级使用手册 4.1 修改项目名和包名 4.2 在线参数配置 4.3 模板位置的变更 4.4 顶部广告的关闭 4.5 添加登录验证码 4.6 spring profile 4.7 多机器部署注意事项 4.8 XSS过滤器 4.8.1 介绍 4.8.2 原理 4.8.3 放过过滤 4.9 多租户功能 4.9.1 介绍 4.9.2 打开租户开关 4.9.3 新建租户 4.9.4 使用租户账户登录 4.9.5 基本原理 4.10 多语言 4.10.1 介绍 4.10.2 录入字典条目 4.10.3 使用字典翻译 5. 核心思想 5.1 分包 5.2 统一异常拦截 5.2.1 介绍 5.2.2 优点 5.2.3 关于性能 5.3 结果包装器 5.3.1 如何使用 5.3.2 ConstantFactory 5.4 前端思想 5.4.1 布局 5.4.2 手动新增标签页 6. 常见问题答疑 6.1 默认的系统登录账号和密码是多少 6.2 权限异常 6.3 为何分页是前端实现 6.4 关于${ctxPath} 6.5 放过某些url的权限验证 6.6 主页的搜索功能 6.7 运行sql报错 6.8 关于打包 6.9 查询结果的驼峰转化问题 6.10 为何使用beetl 6.11 为何有的业务没有service层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值