OERealm security considerations
- Last Updated: February 10, 2026
- 5 minute read
- OpenEdge
- Version 12.2
- Documentation
To maintain robust protection against unauthorized access and potential attacks, it is essential to implement comprehensive security measures throughout the OERealm authentication process.
- Secure the OERealm Service Interface
- Secure the OERealm AuthProvider
- Prevent Authorization Before Authentication
Secure the OERealm Service Interface
If the ABL class providing the OERealm service requires client authentication, the client must include a realm token property pointing to a file that contains a sealed Client-Principal object that the OERealm service can validate.
The OERealm user details service can be configured to send a sealed
Client-Principal object to the PAS for OpenEdge instance on
every method call. In this case, the OERealm service interface might incorrectly
intercept the Client-Principal object from SESSION:CURRENT-REQUEST-INFO:GET-CLIENT-PRINCIPAL and validate the client before
performing any OERealm operation.
Another security risk occurs when using the SECURITY-POLICY:SET-CLIENT() method or SET-DB-CLIENT function for identity checks. These methods change the current identity of the ABL session, which must then be restored after the OERealm operation completes.
Recommended Approach:
Use the Client-Principal:VALIDATE-SEAL() method to validate the Client-Principal
object. This method accepts an optional character expression containing the domain
access code originally used to seal the object. If no access code is provided, the
AVM uses the code defined in the trusted domain registry. Apply this validation at
the start of each OERealm service interface method. This approach isolates OERealm
operations from other identity-related activities, such as session, database, server
connection, or BPM identity.
Secure the OERealm AuthProvider
You can configure the OpenEdge domain access code to seal the
Client-Principal object when using single sign-on (SSO) mode.
By default, the Spring Security OERealm AuthProvider creates
theClient-Principal object as a single tenant, meaning all web
application users share the same OpenEdge domain.
To improve OERealm AuthProvider security, you can apply one of the following:
- Set
userDomainandregistryFileproperties.Enhance security by configuring these
OERealm.AuthProviderproperties in the oeablSecurity.properties file when sealing theClient-Principalobject:- OERealm.AuthProvider.userDomain—Sets the default OpenEdge domain
when the input
useriddoes not include one. - OERealm.AuthProvider.registryFile—Stores the domain access code and supports multiple domains.
Note: TheOERealm.AuthProvider.keyattribute is no longer supported.These attributes allow you to uniquely identify application users based on their domain. You can also disable access to the web application by disabling the domain.
The following table defines the available combinations of domain, domain access code, and user ID:
Domain name Key attribute User ID Signing operation ""(default)""(default)"uid"Seal the blank domain using the built-in domain registry blank access code. """""uid"Seal the blank domain using the clear text string value, ""."abc"""(default)"uid@abc"Seal the abcdomain using the built-in domain registry blank access code."abc""""uid@abc"Seal the abcdomain using the clear text string value,"".CAUTION: Progress Software corporation strongly recommends that you take steps to hide or otherwise protect any domain access code that you specify in your ABL code from access (hacking) by unauthorized users. The clear-text string should be stored encrypted to secure the domain access code, and decrypted only when it is necessary to use the stored value. - OERealm.AuthProvider.userDomain—Sets the default OpenEdge domain
when the input
- Set the multiTenant property.
When you enable the
OERealm.AuthProvider.multiTenantproperty, all the user IDs are appended with theuserDomainvalue only if the user ID being authenticated does not already specify a domain name. - Set the external domain registry for multi-tenant applications.
The OERealm AuthProvider provides support for using an administrator-generated domain registry file to sign and seal
Client-Principalobjects in multi-tenant applications. This file contains a list of domains that are allowed to have access to theClient-Principalobject.To use the domain registry file:
- Use the gendomreg command, located at
DLC/bin, that takes a formatted text file as
input and creates a secure binary domain registry file. The text file
lists OpenEdge domains that are allowed to have access to the
Client-Principalobject in thedomain_name,access_codeformat. Each domain must be listed in a separate line. These values are blank by default. - Copy the generated domain registry file to the OpenEdge ABL web application's /WEB-INF/classes directory.
- Configure the OERealm AuthProvider to load and sign a
Client-Principalobject.
- Use the gendomreg command, located at
DLC/bin, that takes a formatted text file as
input and creates a secure binary domain registry file. The text file
lists OpenEdge domains that are allowed to have access to the
Prevent authorization before authentication
The Client-Principal object that is generated by
the web application’s OERealm AuthProvider supersedes the one that is generated by
the OEClientPrincipalFilter for SSO. This is a problem when the
OEClientPrincipalFilter authorizes the incorrect
Client-Principal object without any processing. You can disable
the OEClientPrincipalFilter by setting the OEClientPrincipalFilter.enabled property to false.
Another potential security problem occurs if a client is able to
call the OERealm service interface without authentication. You can secure the
service interface against unnecessary client access by using the
Client-Principal object and validation technique that is
similar to the one that is used in the ABL business logic of your OpenEdge
application server. To use this validation technique, the web application's OERealmUserDetailsImp module acts as a client and
identifies itself to the application server's OERealm service interface. The service
interface validates the client using a Client-Principal object just
like it is used in other parts of the ABL application.
To develop the web application's OERealmUserDetails so it can act as an OpenEdge application server
client:
- Generate a sealed Client-Principal token file
Use the genspacp utility in DLC/bin to create a
.cpfile representing the OERealm service client.The utility requires:
- User ID
- Domain Name
- Domain Access Code
- Output file name
This creates a binary file containing the sealed
Client-Principalobject. The domain name and access code can match those used by the OERealm service interface for validation or be a unique combination.
- Copy the output file
Place the .cp file in the web application’s WEB-INF/common/lib directory.
- Configure the realm token property
Set
OERealm.UserDetails.realmTokenFileto the output file name (for example, mytoken.cp). - Add validation in the OERealm service interface
Include
Client-Principalvalidation code in the PAS for OpenEdge instanceactivateprocedure or in each OERealm class method.Progress recommends using:
Client-Principal:VALIDATE-SEAL("domain-access-code")For details, see the VALIDATE-SEAL() method in the ABL Reference.
When the OERealm service interface validates the Client-Principal
object from the generated binary file, the following sequence occurs:
- Loading the Client-Principal object
After the web application starts, if the
OERealm.UserDetails.realmTokenFileproperty specifies the output file name, the file is used to load theClient-Principalobject.- If the file cannot be loaded, an error is logged.
- Sending the Client-Principal object
For each user authentication request,
OERealmUserDetailssends theClient-Principalobject to the PAS for OpenEdge instance OERealm service interface methods. - Validation process and outcomes
- If the
Client-Principalobject is not sent, the interface returns an error. - If the object is sent, the interface validates the domain access code:
- If validation fails, an error is returned.
- If validation succeeds, the ABL class method continues execution.
- If the
User password encryption
In the current sample HybridRealm.cls code, the
ENCODE() function provides only a very basic method for
creating a one-way hash of a password. In practice, you should use a more robust and
secure hashing algorithm for both generating and validating user account
passwords.