jeecgboot / JimuReport

「数据可视化:报表、仪表盘、大屏」积木报表是一款类Excel操作风格,在线拖拽设计的报表工具和和数据可视化产品。功能涵盖: 报表设计、打印设计、图形报表、仪表盘门户设计、大屏设计等,完全免费!秉承“简单、易用、专业”的产品理念,极大的降低报表开发难度、缩短开发周期、解决各类报表难题。
http://jimureport.com
GNU General Public License v3.0
6.52k stars 1.66k forks source link

1.6.2及以上报表设计阶段的预览功能被彻底禁用了吗? #2064

Closed NapChen closed 1 year ago

NapChen commented 1 year ago
版本号:

1.6.3

问题描述:

报表设计阶段的预览功能被彻底禁用了吗? 我设置了配置dataSourceSafe: false,依然不能使用设计页面的预览功能。 感觉如果是为了安全问题,可以通过自定义的filter来进行权限校验,没有必要一刀砍死了呀?

错误日志&截图:
image
重现步骤:

友情提示(为了提高issue处理效率):

zhangdaiscott commented 1 year ago

你设置的对吗,截图看完整的配置

NapChen commented 1 year ago
jeecg:
  # local|minio|alioss
  uploadType: local
  # local
  path:
    #文件路径
    upload: /Users/napchen/Documents/dev/hzgc/zqz/zqz-server/file/report/
  jmreport:
    #多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)
    saasMode: tenant
    # 平台上线安全配置(v1.6.2+ 新增)
    firewall:
      # 数据源安全 (开启后,不允许使用平台数据源、SQL解析加签并不允许查询数据库)
      dataSourceSafe: false
      # 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可放开限制)
      lowCodeMode: dev

账号使用的是admin,debug已经确认JmReportTokenServiceI.getRoles返回的是["admin"]

zhangdaiscott commented 1 year ago

image 这个是false不会必选数据源

NapChen commented 1 year ago

不会必选数据源是什么意思?设置成true更不行了,目前我配置成false其他接口正常,只有这一个报表设计界面左上角的预览不行,总是会弹出”安全模式下...“的提示。 以下是积木报表的配置,token解析都正常。

package com.jc.config;

import com.jc.utils.SecurityUtils;
import lombok.RequiredArgsConstructor;
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by napchen
 *
 * @author napchen
 * @description 为报表路径增加自定义token
 * @since 2022-12-09
 */
@Component
@RequiredArgsConstructor
public class JimuReportConfig implements JmReportTokenServiceI {

    @Override
    public String getToken(HttpServletRequest request) {
        return request.getHeader("token");
    }

    @Override
    public String getToken() {
        return JmReportTokenServiceI.super.getToken();
    }

    @Override
    public String getUsername(String key) {
        return SecurityUtils.getCurrentUsername();
    }

    /**
     * 返回角色列表
     *
     * @param s no use
     * @return 返回当前用户的角色列表,以控制报表的部分接口能否访问
     */
    @Override
    public String[] getRoles(String s) {
        return SecurityUtils.getCurrentUserRolesCode();
    }

    @Override
    public Boolean verifyToken(String s) {
        return true;
    }

    /**
     * 返回租户信息
     *
     * @return 租户信息
     */
    @Override
    public String getTenantId() {
        return SecurityUtils.getCurrentUserAccountBookCode();
    }

    @Override
    public HttpHeaders customApiHeader() {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("token", getToken());
        httpHeaders.add("Authorization", "Bearer " + getToken());
        return httpHeaders;
    }
}
zhangdaiscott commented 1 year ago

测试不存在你说的问题,你可以升级到1.6.4最新版看看

NapChen commented 1 year ago

请使用以下最下环境可以稳定复现 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>demo</description>
    <properties>
        <!-- jdk版本号-->
        <java.version>1.8</java.version>
        <!-- DB驱动 -->
        <postgresql.version>42.2.6</postgresql.version>
        <ojdbc6.version>11.2.0.3</ojdbc6.version>
        <sqljdbc4.version>4.0</sqljdbc4.version>
        <mysql-connector-java.version>5.1.14</mysql-connector-java.version>
        <minio.version>8.0.3</minio.version>
    </properties>
    <!-- 配置远程仓库-->
    <repositories>
        <repository>
            <id>aliyun</id>
            <name>aliyun Repository</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>jeecg</id>
            <name>jeecg Repository</name>
            <url>https://maven.jeecg.org/nexus/content/repositories/jeecg</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--freemarker-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

        <!-- minio oss-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>${minio.version}</version>
            <optional>true</optional>
        </dependency>

        <!-- JimuReport -->
        <dependency>
            <groupId>org.jeecgframework.jimureport</groupId>
            <artifactId>jimureport-spring-boot-starter</artifactId>
            <version>1.6.4</version>
        </dependency>

        <!-- 数据库驱动 -->
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
            <optional>true</optional>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>activiti-repos</id>
            <name>Activiti Repository</name>
            <url>https://maven.alfresco.com/nexus/content/groups/public/</url>
        </pluginRepository>
    </pluginRepositories>

</project>

JmReportTokenServiceI

package com.example.demo;

import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by napchen
 *
 * @author napchen
 * @description 为报表路径增加自定义token
 * @since 2022-12-09
 */
@Component
public class JimuReportConfig implements JmReportTokenServiceI {

    @Override
    public String getToken(HttpServletRequest request) {
        return request.getHeader("token");
    }

    @Override
    public String getToken() {
        return JmReportTokenServiceI.super.getToken();
    }

    @Override
    public String getUsername(String key) {
        return "admin";
    }

    /**
     * 返回角色列表
     *
     * @param s no use
     * @return 返回当前用户的角色列表,以控制报表的部分接口能否访问
     */
    @Override
    public String[] getRoles(String s) {
        return new String[]{"admin"};
    }

    @Override
    public Boolean verifyToken(String s) {
        return true;
    }

    /**
     * 返回租户信息
     *
     * @return 租户信息
     */
    @Override
    public String getTenantId() {
        return "zqz";
    }

    @Override
    public HttpHeaders customApiHeader() {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("token", getToken());
        httpHeaders.add("Authorization", "Bearer " + getToken());
        return httpHeaders;
    }
}

application.yml

server:
  port: 9000
spring:
  #配置静态资源
  mvc:
    static-path-pattern: /**
  resource:
    static-locations: classpath:/static/
  #配置数据库
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/zqz?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
    username: root
    password: Chen1464792252
    driver-class-name: com.mysql.cj.jdbc.Driver
#JimuReport[minidao配置]
minidao :
  base-package: org.jeecg.modules.jmreport.desreport.dao*
  db-type: mysql
#JimuReport[上传配置]
jeecg :
  jmreport:
    #多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)
    saasMode: tenant
    # 自动保存
    autoSave: true
    # 单位毫秒 默认5*60*1000
    interval: 10000
    # 平台上线安全配置(v1.6.2+ 新增)
    firewall:
      # 数据源安全 (开启后,不允许使用平台数据源、SQL解析加签并不允许查询数据库)
      dataSourceSafe: false
      # 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可放开限制)
      lowCodeMode: dev

  # local|minio|alioss
  uploadType: local
  # local
  path :
    #文件路径
    upload: D:\images

#输出sql日志
logging:
  level:
    org.jeecg.modules.jmreport : debug

需要配置租户为tenant,预览数据接口会报安全模式下,不允许使用平台数据源,关闭租户则不会有此问题,目前1.6.4依然存在此问题

zhangdaiscott commented 1 year ago

如果你开启了saass模式,那必须选择数据源,目前规则就是这样的

NapChen commented 1 year ago

如果你开启了saass模式,那必须选择数据源,目前规则就是这样的

请问下如何选择数据源?

zhangdaiscott commented 1 year ago

新建数据源

NapChen commented 1 year ago

已解决,在数据集编写界面新建与系统平台相同的数据源即可进行预览,感谢!