JasperReports Server:根据用户切换JDBC数据源

时间:2012-12-21 19:45:41

标签: datasource jasperserver

任何人都可以提供有关如何执行此操作的说明吗?我设置了几个不同的JDBC DataSource,并希望能够配置用户使用不同的数据源运行相同的报表。例如。当用户A登录并运行报告A时,使用数据源1;当用户B登录并运行报告A时,使用数据源2。我使用的是4.0版本。

4 个答案:

答案 0 :(得分:2)

我正在使用JasperReports Server的6.2版,这是完全可能的,因为用户有属性,你可以在数据源连接设置中引用这些属性。

例如,您不会为数据库主机设置特定的IP。相反,您将引用用户属性(可以为用户定义属性或从组织或服务器本身继承属性):

host = {attribute('dbHost')}

host = {attribute('dbHost', 'User')}

前者尝试在整个层次结构中找到该属性(用户>组织>父组织>服务器)。后者希望找到在用户级别定义的属性。

您可以在 JasperReports服务器管理指南的4.1节中找到完整说明,并在此处:

http://community.jaspersoft.com/documentation/tibco-jasperreports-server-administrator-guide/v601/attributes-data-source-definitions

答案 1 :(得分:0)

JasperReports Server中没有内置功能。您需要实现一个Java Extension,它可以作为JDBC数据源的包装器。该包装器将利用每个用户选择的现有连接或用户对象本身将所需信息传递给数据源。 This article可能适用于早期版本,但可以指导您朝着正确的方向发展。

有关自定义数据源的更多详细信息,您也可以在JasperReports Server安装的samples / customDataSource文件夹中找到(jasperserver-install-dir / samples)

答案 2 :(得分:0)

使用多租户版本的JasperReports Server可以实现这样的功能。您将拥有2个(或更多)租赁/公司,其中用户被分配到不同的公司。登录用户时,只能看到属于该公司的报告/资源。这样,每个公司可以拥有不同的数据源,在每个公司中设置相同的报告,但每个报告单元将指向相应的数据源。 如果您担心报告重复,但共同报告JRXML资源文件到两个公司都可以看到的公共文件夹(例如,在根级别),并且报告单位将这些文件称为子报告。

答案 3 :(得分:0)

现在似乎有可能,但可能不是每个用户,而是每个角色更多。所以你可以设置一堆数据源,例如对于角色admin,manager,user,guest,然后为用户使用适当的数据源。

<强> Switching A DataSource Based On A User - JasperSoft Community Wiki

  

此示例显示如何使用a切换每个用户的JDBC数据源   JasperReports Server中的自定义数据源。该示例适用于   JasperReports Server版本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>
     

自定义数据源需要实现   ReportDataSourceService接口

 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();
     }
 }