JasperReports ব্যবহার করে Report Level Security এবং User-specific Data Filtering কার্যকরীভাবে করা যেতে পারে। এই ফিচারগুলি আপনাকে বিভিন্ন ব্যবহারকারীর জন্য রিপোর্টে ডেটা প্রদর্শন নিয়ন্ত্রণ করতে এবং নির্দিষ্ট শর্ত অনুযায়ী ডেটা ফিল্টার করতে সাহায্য করে।
Report Level Security
Report Level Security-এ মূলত রিপোর্টের মধ্যে সংবেদনশীল তথ্য সুরক্ষিত রাখা হয়। যখন রিপোর্টের মধ্যে নির্দিষ্ট ডেটা থাকে যা শুধুমাত্র অনুমোদিত ব্যবহারকারীর জন্য অ্যাক্সেসযোগ্য, তখন এটি Report Level Security এর আওতায় আসে।
ব্যবহার:
- User Authentication এবং Authorization: রিপোর্ট তৈরির সময় ব্যবহারকারীর ভূমিকা নির্ধারণ করে নির্দিষ্ট ডেটা ফিল্টার করা।
- Conditional Data Display: নির্দিষ্ট ব্যবহারকারীর জন্য ডেটার প্রবাহ নিয়ন্ত্রণ করতে পারেন।
User-specific Data Filtering
User-specific Data Filtering ব্যবহারকারীর তথ্য বা প্রোফাইলের ভিত্তিতে রিপোর্টের ডেটা ফিল্টার করে। এটি সাধারণত ডেটাবেসের উপর ভিত্তি করে চলতে পারে, যেখানে আপনি ব্যবহারকারীর পরিচয় অনুযায়ী ডেটা দেখাতে পারেন।
ব্যবহার:
- Dynamic Parameters: রিপোর্টের মধ্যে parameters ব্যবহার করে ব্যবহারকারীর ইনপুটের ভিত্তিতে ডেটা ফিল্টার করা।
- Role-based Data Filtering: ব্যবহারকারীর role অথবা permissions অনুযায়ী ডেটা ফিল্টার করা।
ধাপ ১: Report Level Security উদাহরণ
ধরা যাক, আমাদের একটি Sales Report তৈরি করতে হবে এবং এই রিপোর্টের কিছু অংশ শুধুমাত্র Manager বা Admin ব্যবহারকারীদের জন্য দেখানো হবে।
1.1. JRXML রিপোর্ট ডিজাইন
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="SalesReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<!-- Fields -->
<field name="salesRep" class="java.lang.String"/>
<field name="productName" class="java.lang.String"/>
<field name="salesAmount" class="java.lang.Double"/>
<!-- Parameter to check user role (Manager or Admin) -->
<parameter name="userRole" class="java.lang.String"/>
<!-- Conditional Data (Sales Report only for Managers or Admins) -->
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[$F{salesRep}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="120" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{productName}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="330" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[$F{salesAmount}]]></textFieldExpression>
</textField>
<!-- Conditional check for displaying sensitive data -->
<textField>
<reportElement x="440" y="0" width="150" height="20"/>
<textFieldExpression>
<![CDATA[
$P{userRole}.equals("Manager") || $P{userRole}.equals("Admin") ?
"Sensitive Data" : "No Access"
]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
ব্যাখ্যা:
userRoleপ্যারামিটার: এখানে একটি প্যারামিটার তৈরি করা হয়েছে যা ব্যবহারকারীর role (যেমন: Manager বা Admin) চেক করবে।- Conditional Data Display: একটি শর্তযুক্ত এক্সপ্রেশন ব্যবহার করা হয়েছে, যেখানে Manager বা Admin ছাড়া অন্য ব্যবহারকারীরা "No Access" দেখতে পাবে।
1.2. Java কোড দিয়ে রিপোর্ট জেনারেট করা
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SalesReportWithSecurity {
public static void main(String[] args) {
try {
// Sample Sales Data
List<SalesData> salesDataList = new ArrayList<>();
salesDataList.add(new SalesData("John Doe", "Product A", 5000));
salesDataList.add(new SalesData("Jane Smith", "Product B", 3000));
// JRBeanCollectionDataSource for Sales Data
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(salesDataList);
// Compile the report
JasperReport jasperReport = JasperCompileManager.compileReport("SalesReport.jrxml");
// Parameters for the report (role-based data filtering)
Map<String, Object> parameters = new HashMap<>();
parameters.put("userRole", "Manager"); // Simulating Manager role
// Fill the report with data
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
// Export the report to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "SalesReportWithSecurity.pdf");
System.out.println("Report Generated Successfully!");
} catch (JRException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
userRoleপ্যারামিটার Java কোডে সেট করা হয়েছে। এখানে, "Manager" রোল ব্যবহার করা হয়েছে, তাই রিপোর্টের sensitive data অংশ "Sensitive Data" প্রদর্শিত হবে।
ধাপ ২: User-specific Data Filtering
এখন আমরা দেখব user-specific data filtering কিভাবে করা যায়, যেখানে ব্যবহারকারীর role বা other parameters অনুযায়ী ডেটা ফিল্টার করা হবে।
2.1. JRXML Report with User-specific Data Filtering
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="FilteredSalesReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<!-- Fields and Parameters -->
<field name="salesRep" class="java.lang.String"/>
<field name="productName" class="java.lang.String"/>
<field name="salesAmount" class="java.lang.Double"/>
<parameter name="minSalesAmount" class="java.lang.Double"/>
<queryString>
<![CDATA[SELECT salesRep, productName, salesAmount FROM Sales WHERE salesAmount >= $P{minSalesAmount}]]>
</queryString>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[$F{salesRep}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="120" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{productName}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="330" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[$F{salesAmount}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
ব্যাখ্যা:
minSalesAmountপ্যারামিটার: ব্যবহারকারীর জন্য minimum sales সেট করতে প্যারামিটার যোগ করা হয়েছে। এটি SQL কোয়েরিতে ব্যবহার হবে এবং minimum sales amount এর নিচে ডেটা দেখাবে না।- Query: কোয়েরিতে
$P{minSalesAmount}প্যারামিটারটি যুক্ত করা হয়েছে।
2.2. Java কোড দিয়ে Data Filtering
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FilteredSalesReport {
public static void main(String[] args) {
try {
// Sample Sales Data
List<SalesData> salesDataList = new ArrayList<>();
salesDataList.add(new SalesData("John Doe", "Product A", 5000));
salesDataList.add(new SalesData("Jane Smith", "Product B", 2000));
salesDataList.add(new SalesData("Robert Brown", "Product C", 3000));
// JRBeanCollectionDataSource for Sales Data
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(salesDataList);
// Compile the report
JasperReport jasperReport = JasperCompileManager.compileReport("FilteredSalesReport.jrxml");
// Parameters for data filtering
Map<String, Object> parameters = new HashMap<>();
parameters.put("minSalesAmount", 3000); // Filter for sales >= 3000
// Fill the report with data
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
// Export the report to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "FilteredSalesReport.pdf");
System.out.println("Filtered Report Generated Successfully!");
} catch (JRException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- minSalesAmount প্যারামিটার Java কোডে 3000 এর জন্য সেট করা হয়েছে, ফলে শুধুমাত্র 3000 এর বেশি বিক্রির তথ্য রিপোর্টে দেখানো হবে।
- Report Level Security: JasperReports-এ Report Level Security দিয়ে আপনি ব্যবহারকারীর role বা permissions অনুযায়ী রিপোর্টের ডেটা প্রদর্শন নিয়ন্ত্রণ করতে পারেন।
- User-specific Data Filtering: User-specific filtering ব্যবহার করে আপনি parameters বা role অনুযায়ী রিপোর্টের ডেটা ফিল্টার করতে পারেন, যেমন minimum sales, region, বা employee-specific ডেটা।
- Dynamic Reports: JasperReports ব্যবহারকারীদের জন্য ডায়নামিক রিপোর্ট তৈরি করার জন্য একটি শক্তিশালী টুল, যেখানে parameters এবং conditional formatting এর মাধ্যমে রিপোর্ট কাস্টমাইজ করা সম্ভব।
এই উদাহরণে আমরা দেখলাম কিভাবে JasperReports ব্যবহার করে Report Level Security এবং User-specific Data Filtering কার্যকরীভাবে সম্পন্ন করা যায়।
Read more