💡 Introduction
Sometimes in Joget applications, user or contact records may be created without passwords — especially during data imports or integrations.
To fix that, we can automate password creation using a BeanShell script, which directly connects to Joget’s database and assigns secure random passwords to any empty password fields.
🎯 Goal
Automatically generate a secure, random password for every record in the app_fd_Contacts table where c_Password is NULL.
⚙️ How It Works
This BeanShell script:
- Connects to Joget’s database using
AppUtil. - Finds all records missing passwords.
- Generates a random secure password.
- Updates the database with the new passwords.
- Logs the output for easy tracking.
🧱 BeanShell Script
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Random; import javax.sql.DataSource; import org.joget.apps.app.service.AppUtil; import org.joget.commons.util.LogUtil; // Character sets for password generation private final String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz"; private final String CHAR_UPPER = CHAR_LOWER.toUpperCase(); private final String NUMBER = "0123456789"; private final String SPECIAL_CHARS = "!@#$%^&*()_-+=<>?"; private final String ALL_CHARS = CHAR_LOWER + CHAR_UPPER + NUMBER + SPECIAL_CHARS; private final Random RANDOM = new Random(); Connection connection = null; public void RandomPasswordGenerator() { try { // Get Joget database connection from AppUtil DataSource ds = (DataSource) AppUtil.getApplicationContext().getBean("setupDataSource"); connection = ds.getConnection(); // Select records with missing passwords String selectQuery = "SELECT id FROM app_fd_Contacts WHERE c_Password IS NULL"; // Update query to assign new passwords String updateQuery = "UPDATE app_fd_Contacts SET c_Password = ? WHERE id = ?"; PreparedStatement selectStatement = connection.prepareStatement(selectQuery); PreparedStatement updateStatement = connection.prepareStatement(updateQuery); ResultSet resultSet = selectStatement.executeQuery(); while (resultSet.next()) { LogUtil.info("", "Inside while loop"); // Get record ID String id = resultSet.getString("id"); // Generate new random password String newPassword = generateRandomPassword(); LogUtil.info("", newPassword); // Update the record with the generated password updateStatement.setString(1, newPassword); updateStatement.setString(2, id); updateStatement.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } finally { // Always close connection in finally block if (connection != null) { try { connection.close(); } catch (Exception e) { e.printStackTrace(); } } } } // Function to generate a secure random password public String generateRandomPassword() { StringBuilder sb = new StringBuilder(8); // Ensure at least one character from each category sb.append(CHAR_LOWER.charAt(RANDOM.nextInt(CHAR_LOWER.length()))); sb.append(CHAR_UPPER.charAt(RANDOM.nextInt(CHAR_UPPER.length()))); sb.append(NUMBER.charAt(RANDOM.nextInt(NUMBER.length()))); sb.append(SPECIAL_CHARS.charAt(RANDOM.nextInt(SPECIAL_CHARS.length()))); // Fill the rest of the password randomly for (int i = 4; i < 8; i++) { int randomIndex = RANDOM.nextInt(ALL_CHARS.length()); sb.append(ALL_CHARS.charAt(randomIndex)); } // Shuffle the generated password for randomness char[] passwordChars = sb.toString().toCharArray(); for (int i = 0; i < passwordChars.length; i++) { int randomIndex = RANDOM.nextInt(passwordChars.length); char temp = passwordChars[i]; passwordChars[i] = passwordChars[randomIndex]; passwordChars[randomIndex] = temp; } return new String(passwordChars); } // Execute the function RandomPasswordGenerator();
Top comments (0)