Hello Everyone,
I’m trying to implement manual provisioning for PostgreSQL in SailPoint IIQ by adding a Create Provisioning Rule under the application’s connector rules section.
However, after saving the rule and performing manual provisioning (account creation), when I tried to open the application again in IIQ, the application page went blank and showed an error message instead of loading properly.
It seems that adding the custom rule somehow corrupted the application definition or XML, because the rest of the pages in IdentityIQ are working fine — only this application fails to load.
Rule:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import sailpoint.object.ProvisioningPlan.AccountRequest;
import sailpoint.object.ProvisioningPlan.AttributeRequest;
import sailpoint.object.ProvisioningResult;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
// Helper method to get attribute values
public String getAttributeRequestValue(AccountRequest acctReq, String attribute) {
if (acctReq != null) {
AttributeRequest attrReq = acctReq.getAttributeRequest(attribute);
if (attrReq != null) {
return attrReq.getValue();
}
}
return null;
}
// Main Provisioning Rule
AccountRequest acctRequest = (AccountRequest) request;
ProvisioningResult result = new ProvisioningResult();
Log log = LogFactory.getLog("postgres-provisioning");
Connection connection = null;
try {
// PostgreSQL Connection
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection(
"jdbc:postgresql://localhost:5432/viraj", // DB URL
"postgres", // DB user
"your_password" // DB password
);
log.debug("Operation [" + acctRequest.getOperation() + "] detected.");
if ("Create".equalsIgnoreCase(acctRequest.getOperation().toString())) {
// INSERT into authoritative table
PreparedStatement statement = connection.prepareStatement(
"INSERT INTO authoritative(id,employee_id, first_name, last_name, email, department, title, manager_id, status, location) " +
"VALUES (?,?,?,?,?,?,?,?,?,?)"
);
statement.setString(1, getAttributeRequestValue(acctRequest,"id"));
statement.setString(2, getAttributeRequestValue(acctRequest,"employee_id"));
statement.setString(2, getAttributeRequestValue(acctRequest,"first_name"));
statement.setString(3, getAttributeRequestValue(acctRequest,"last_name"));
statement.setString(4, getAttributeRequestValue(acctRequest,"email"));
statement.setString(5, getAttributeRequestValue(acctRequest,"department"));
statement.setString(6, getAttributeRequestValue(acctRequest,"title"));
statement.setString(7, getAttributeRequestValue(acctRequest,"manager_id"));
statement.setString(9, getAttributeRequestValue(acctRequest,"status"));
statement.setString(10, getAttributeRequestValue(acctRequest,"location"));
statement.executeUpdate();
result.setStatus(ProvisioningResult.STATUS_COMMITTED);
}
else {
log.debug("Unsupported operation: " + acctRequest.getOperation());
}
}
catch (Exception e) {
log.error("Provisioning failed: ", e);
result.setStatus(ProvisioningResult.STATUS_FAILED);
result.addError(e);
}
finally {
if (connection != null) {
try { connection.close(); } catch (SQLException e) { log.error(e); }
}
}
return result;
<ProvisioningForms><Form name="PostgresForm" objectType="account" type="Create"><Attributes><Map><entry key="pageTitle" value="PostgresForm"/></Map></Attributes><Section name="Data"><Field displayName="ID" name="id" required="true" type="string"/><Field displayName="Employee Id" name="employee_id" required="true" type="string"/><Field displayName="First Name" name="first_name" required="true" type="string"/><Field displayName="Last Name" name="last_name" required="true" type="string"/><Field displayName="Department" name="department" required="true" type="string"/><Field displayName="Title	" name="title	" required="true" type="string"/><Field displayName="Email" name="email" required="true" type="string"/><Field displayName="Location" name="location" required="true" type="string"/><Field displayName="Manager Id" name="manager_id" required="true" type="string"/><Field displayName="Status" name="status" required="true" type="string"/></Section></Form></ProvisioningForms>
