INTRODUCTION: Simple Login Form Features
This Java login form is a basic GUI application with the following features:
- Clean User Interface: Simple and intuitive design with proper layout
- Username and Password Fields: Standard input fields for credentials
- Login Button: Processes the authentication
- Cancel Button: Clears all fields
- Basic Validation: Checks if fields are empty
- Simple Authentication: Uses hardcoded credentials for demonstration
- Success/Failure Messages: Popup dialogs informing the user of login status
- Reset Functionality: Clears fields after failed attempts or when cancelled
COMPLETE JAVA CODE
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SimpleLoginForm extends JFrame implements ActionListener {
// Declare components
private JLabel titleLabel;
private JLabel usernameLabel;
private JLabel passwordLabel;
private JTextField usernameField;
private JPasswordField passwordField;
private JButton loginButton;
private JButton cancelButton;
private JPanel panel;
// Constructor
public SimpleLoginForm() {
// Set up the frame
setTitle("Simple Login Form");
setSize(350, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // Center the window
setResizable(false);
// Create panel with GridBagLayout for better control
panel = new JPanel(new GridBagLayout());
panel.setBackground(new Color(240, 248, 255)); // Light blue background
GridBagConstraints constraints = new GridBagConstraints();
constraints.insets = new Insets(10, 10, 10, 10); // Padding
// Create components
titleLabel = new JLabel("LOGIN SYSTEM");
titleLabel.setFont(new Font("Arial", Font.BOLD, 18));
titleLabel.setForeground(new Color(0, 102, 204)); // Blue color
usernameLabel = new JLabel("Username:");
usernameLabel.setFont(new Font("Arial", Font.PLAIN, 14));
passwordLabel = new JLabel("Password:");
passwordLabel.setFont(new Font("Arial", Font.PLAIN, 14));
usernameField = new JTextField(15);
usernameField.setFont(new Font("Arial", Font.PLAIN, 14));
passwordField = new JPasswordField(15);
passwordField.setFont(new Font("Arial", Font.PLAIN, 14));
loginButton = new JButton("Login");
loginButton.setBackground(new Color(0, 153, 76)); // Green
loginButton.setForeground(Color.WHITE);
loginButton.setFocusPainted(false);
loginButton.setFont(new Font("Arial", Font.BOLD, 14));
cancelButton = new JButton("Cancel");
cancelButton.setBackground(new Color(204, 0, 0)); // Red
cancelButton.setForeground(Color.WHITE);
cancelButton.setFocusPainted(false);
cancelButton.setFont(new Font("Arial", Font.BOLD, 14));
// Add action listeners
loginButton.addActionListener(this);
cancelButton.addActionListener(this);
// Add components to panel with constraints
// Title
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 2;
constraints.anchor = GridBagConstraints.CENTER;
panel.add(titleLabel, constraints);
// Username label
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.EAST;
panel.add(usernameLabel, constraints);
// Username field
constraints.gridx = 1;
constraints.gridy = 1;
constraints.anchor = GridBagConstraints.WEST;
panel.add(usernameField, constraints);
// Password label
constraints.gridx = 0;
constraints.gridy = 2;
constraints.anchor = GridBagConstraints.EAST;
panel.add(passwordLabel, constraints);
// Password field
constraints.gridx = 1;
constraints.gridy = 2;
constraints.anchor = GridBagConstraints.WEST;
panel.add(passwordField, constraints);
// Login button
constraints.gridx = 0;
constraints.gridy = 3;
constraints.anchor = GridBagConstraints.CENTER;
panel.add(loginButton, constraints);
// Cancel button
constraints.gridx = 1;
constraints.gridy = 3;
constraints.anchor = GridBagConstraints.CENTER;
panel.add(cancelButton, constraints);
// Add panel to frame
add(panel);
setVisible(true);
}
// Handle button clicks
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == loginButton) {
performLogin();
} else if (e.getSource() == cancelButton) {
clearFields();
}
}
// Method to perform login validation
private void performLogin() {
String username = usernameField.getText().trim();
String password = new String(passwordField.getPassword());
// Check if fields are empty
if (username.isEmpty() || password.isEmpty()) {
JOptionPane.showMessageDialog(this,
"Please enter both username and password!",
"Input Error",
JOptionPane.ERROR_MESSAGE);
return;
}
// Hardcoded credentials for demo (in real app, check against database)
if (username.equals("admin") && password.equals("password123")) {
JOptionPane.showMessageDialog(this,
"Login Successful! Welcome " + username + "!",
"Success",
JOptionPane.INFORMATION_MESSAGE);
clearFields();
} else {
JOptionPane.showMessageDialog(this,
"Invalid username or password!",
"Login Failed",
JOptionPane.ERROR_MESSAGE);
passwordField.setText(""); // Clear password field only
}
}
// Method to clear all input fields
private void clearFields() {
usernameField.setText("");
passwordField.setText("");
}
// Main method to run the application
public static void main(String[] args) {
// Run GUI in Event Dispatch Thread for thread safety
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new SimpleLoginForm();
}
});
}
}
HOW TO USE:
- Save the file as
SimpleLoginForm.java - Compile:
javac SimpleLoginForm.java - Run:
java SimpleLoginForm
DEFAULT CREDENTIALS:
- Username: admin
- Password: password123
KEY POINTS:
- The form validates empty fields
- Shows appropriate popup messages
- Clears fields after successful login or cancel
- Uses GridBagLayout for precise component positioning
- Event-driven programming with ActionListener
- Thread-safe GUI creation using SwingUtilities.invokeLater()
You can easily modify the credentials or enhance it to connect to a database for real-world applications!
Advanced Java Security: OAuth 2.0, Strong Authentication & Cryptographic Best Practices
Summary: These articles collectively explain how modern Java systems implement secure authentication, authorization, and password protection using industry-grade standards like OAuth 2.0 extensions, mutual TLS, and advanced password hashing algorithms, along with cryptographic best practices for generating secure randomness.
Links with explanations:
https://macronepal.com/blog/dpop-oauth-demonstrating-proof-of-possession-in-java-binding-tokens-to-clients/ (Explains DPoP, which binds OAuth tokens to a specific client so stolen tokens cannot be reused by attackers)
https://macronepal.com/blog/beyond-bearer-tokens-implementing-mutual-tls-for-strong-authentication-in-java/ (Covers mTLS, where both client and server authenticate each other using certificates for stronger security than bearer tokens)
https://macronepal.com/blog/oauth-2-0-token-exchange-in-java-implementing-rfc-8693-for-modern-identity-flows/ (Explains token exchange, allowing secure swapping of access tokens between services in distributed systems)
https://macronepal.com/blog/true-randomness-integrating-hardware-rngs-for-cryptographically-secure-java-applications/ (Discusses hardware-based random number generation for producing truly secure cryptographic keys)
https://macronepal.com/blog/the-password-hashing-dilemma-bcrypt-vs-pbkdf2-in-java/ (Compares BCrypt and PBKDF2 for password hashing and their resistance to brute-force attacks)
https://macronepal.com/blog/scrypt-implementation-in-java-memory-hard-password-hashing-for-jvm-applications/ (Explains Scrypt, a memory-hard hashing algorithm designed to resist GPU/ASIC attacks)
https://macronepal.com/blog/modern-password-security-implementing-argon2-in-java-applications/ (Covers Argon2, a modern and highly secure password hashing algorithm with strong memory-hard protections)