【发布时间】:2012-12-21 19:45:41
【问题描述】:
谁能提供有关如何执行此操作的说明?我设置了几个不同的 JDBC 数据源,并希望能够配置用户使用不同的数据源运行相同的报告。例如。当用户 A 登录并运行报表 A 时,使用数据源 1;当用户 B 登录并运行报表 A 时,使用数据源 2。我使用的是 4.0 版。
【问题讨论】:
谁能提供有关如何执行此操作的说明?我设置了几个不同的 JDBC 数据源,并希望能够配置用户使用不同的数据源运行相同的报告。例如。当用户 A 登录并运行报表 A 时,使用数据源 1;当用户 B 登录并运行报表 A 时,使用数据源 2。我使用的是 4.0 版。
【问题讨论】:
我正在使用 JasperReports Server 6.2 版,这是完全可能的,因为用户具有属性,您可以在数据源连接设置中引用这些属性。
例如,您不会为您的数据库主机设置特定的 ip。相反,您将引用用户属性(属性可以为用户定义或从组织或服务器本身继承):
host = {attribute('dbHost')}
或
host = {attribute('dbHost', 'User')}
前者试图在整个层次结构(用户>组织>父组织>服务器)中查找属性。后者期望找到在用户级别定义的属性。
您可以在 JasperReports 服务器管理员指南 的第 4.1 节中找到完整的解释,并在此处:
【讨论】:
JasperReports Server 中没有内置功能可以执行此操作。您需要实现一个 Java 扩展,它可以作为 JDBC 数据源的包装器。此包装器将利用为每个用户选择的现有连接或用户对象本身将所需信息传递给数据源。 This article 可能适用于早期版本,但可以引导您朝着正确的方向前进。
有关自定义数据源的更多详细信息,您还可以在 JasperReports 服务器安装 (jasperserver-install-dir/samples) 中的 samples/customDataSource 文件夹中找到
【讨论】:
这样的事情可以通过使用 JasperReports 服务器的多租户版本来实现。您将拥有 2 个(或更多)租约/公司,其中用户被分配到不同的公司。登录时,用户只会看到属于该公司的报告/资源。这样,您可以为每个公司拥有不同的数据源,在每个公司中设置相同的报告,但每个报告单元将指向各自的数据源。 如果您担心报告重复,但将通用报告 JRXML 资源文件放入两家公司都可以看到的通用文件夹(例如在根级别),并且报告单元将这些称为子报告。
【讨论】:
现在似乎有可能,虽然可能不是每个用户,而是每个角色。所以你可以设置一堆数据源,例如对于角色 admin、manager、user、guest,然后为用户使用适当的数据源。
Switching A DataSource Based On A User - JasperSoft Community Wiki
此示例显示如何使用 JasperReports 服务器中的自定义数据源。该示例适用于 JasperReports 服务器版本 3.5.1
\WEB-INF\applicationContext-customds.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="SwitcherDS" class="com.jaspersoft.ps.examples.SwitchingDataSourceFactory" > <property name="repositoryService"> <ref bean="repositoryService"/> </property> <property name="dataSourceServiceFactories"> <ref bean="dataSourceServiceFactories"/> </property> </bean> </beans>自定义数据源需要实现 报表数据源服务接口
public void setReportParameterValues(Map parameterValues) { MetadataUserDetails userDetails = (MetadataUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); String userName = userDetails.getUsername(); // obtain a connection based on the username. String dataSourceURI = "/datasources/test2"; if (userName.equalsIgnoreCase("jasperadmin")) { dataSourceURI = "/datasources/ds_1"; } connection = getRepositoryDatasource(dataSourceURI); try { parameterValues.put(JRParameter.REPORT_CONNECTION, connection.getDataSource().getConnection()); } catch (SQLException sqle){ sqle.printStackTrace(); } }
【讨论】: