In the BOD programming model, the resources that services act upon are nouns, which are
represented by generated logical SDOs. However, these SDOs do not implement the Protectable
interface, which is required in order for the PolicyManager to verify that a service has the rights
to work with these nouns. A wrapper class must be implemented for each noun to extract the
information required by the PolicyManager to perform its checks. This mapping is defined in the
wc-component.xml file.
Procedure
-
Open HCL Commerce Developer.
-
For each noun in your service module, create a wrapper class that implements the Protectable
interface. When the PolicyManager invokes the methods on the Protectable wrapper object, the
Protectable object will use the noun to retrieve information to return the appropriate response.
Although some information may be available in the noun, such as owner, the command cannot assume
this information is correct. This assumption will allow the access control check to pass even though
it could be invalid. It is the Protectable wrapper object that understands the noun and how the
information correlates to the authorization check.
-
Create a Java class in your customization project that extends from the
AbstractProtectableProxy class and implements the Protectable interface. The class should follow
this naming convention:
com.<company
name>.<component>.facade.server.authorization.<noun name>ProtectableProxy
.
-
There are two methods that must be implemented for each proxy class,
fulfills(Long
member, String relationship)
and getOwner()
.
The following code is an example of the fulfills()
method:
/**
* This method determines if a given member fulfills a given relationship
* with the resource.
*
* @param member
* This is the member id of the member.
* @param relationship
* This is the relationship the member has with to the resource.
* @return This method will always return <code>true</code>.
* @exception RemoteException
* @exception Exception
*/
public boolean fulfills(Long member, String relationship)
throws RemoteException, Exception {
final String METHODNAME = "fulfills(Long, String)";
if (com.ibm.commerce.foundation.common.util.logging.LoggingHelper
.isEntryExitTraceEnabled(LOGGER)) {
LOGGER.entering(CLASSNAME, METHODNAME);
LOGGER.exiting(CLASSNAME, METHODNAME);
}
return super.fulfills(member, relationship);
}
The
following code is an example of the getOwner()
method:
/**
* This method will return the owner of the protectable object. If the owner
* has not been specified on the proxy object, then the owner is the
* owner of the store that can be resolved from the command context.
*
* @return The owner of the protectable proxy.
* @exception Exception
* A problem occurred while resolving the owner.
* @exception RemoteException
* A problem occurred while accessing a remote resource.
* @see com.ibm.commerce.security.Protectable#getOwner()
*/
public Long getOwner() throws Exception, RemoteException {
final String METHODNAME = "getOwner()";
if (com.ibm.commerce.foundation.common.util.logging.LoggingHelper
.isEntryExitTraceEnabled(LOGGER)) {
LOGGER.entering(CLASSNAME, METHODNAME);
}
Long oOwner = null;
CampaignType aCampaignType = (CampaignType) getObject();
// We expect the storeId information in IdentifierType to be resolved
if (aCampaignType != null
&& aCampaignType.getCampaignIdentifier() != null
&& aCampaignType.getCampaignIdentifier()
.getExternalIdentifier() != null
&& aCampaignType.getCampaignIdentifier()
.getExternalIdentifier().getStoreIdentifier() != null
&& aCampaignType.getCampaignIdentifier()
.getExternalIdentifier().getStoreIdentifier()
.getUniqueID() != null) {
Integer nStoreId = new Integer(aCampaignType
.getCampaignIdentifier().getExternalIdentifier()
.getStoreIdentifier().getUniqueID());
if (LoggingHelper.isTraceEnabled(LOGGER)) {
LOGGER.logp(Level.FINE, CLASSNAME, METHODNAME, "storeId=" + nStoreId);
}
StoreAccessBean abStore = StoreRegistry.singleton().find(nStoreId);
if (abStore != null) {
oOwner = abStore.getOwner();
} else {
// this is site level
oOwner = super.getOwner();
}
} else {
oOwner = super.getOwner();
}
if (com.ibm.commerce.foundation.common.util.logging.LoggingHelper
.isEntryExitTraceEnabled(LOGGER)) {
LOGGER.exiting(CLASSNAME, METHODNAME);
}
return oOwner;
}
-
Register the Protectable proxy class.
-
Create the access control policy XML file, following the examples for the different types of
OAGIS verbs presented in Access control in the BOD command framework
-
Load the access control policy following the instructions in Loading access control policy definitions and other policy-related elements.