Contrôle d'accès dans l'infrastructure de commandes BOD
Comme dans les versions précédentes de HCL Commerce, les vérifications de contrôle d'accès dans l'infrastructure de commandes BOD sont effectuées juste avant l'exécution de la logique commerciale. Cette infrastructure continue à utiliser le gestionnaire de stratégies HCL Commerce comme moteur de contrôle d'accès par défaut. Des stratégies de contrôle d'accès sont toujours requises pour octroyer aux utilisateurs un accès aux commandes et aux ressources. Cependant, la convention de dénomination des actions et des ressources est différente dans l'infrastructure de commandes BOD.
Les ressources sur lesquelles opèrent les commandes BOD sont des noms qui sont représentés par des objets Java générés. Ces objets générés n'implémentent pas l'interface Protectable requise par le gestionnaire PolicyManager. Pour répondre à cette exigence, une classe d'encapsulation doit être implémentée pour chaque nom afin d'extraire les informations requises par le gestionnaire PolicyManager pour effectuer ses vérifications d'autorisation. Ce mappage est défini dans le fichier wc-component.xml. Dans le cas de commandes de paires nom-valeur SOI, une autorisation est effectuée au niveau de la commande et de la ressource avant leur exécution. Dans l'infrastructure de commandes BOD, seules des vérifications de contrôle d'accès au niveau ressources sont effectuées, à l'exception des requêtes Get pour lesquelles une vérification de l'autorisation d'utilisation du profil d'accès spécifié est effectuée. Le profil d'accès permet de restreindre l'accès aux données et à certaines vues à des types d'utilisateurs déterminés. Ceci est suffisant pour vérifier si un utilisateur est habilité à exécuter une commande sur une ressource donnée.
Deux ressources doivent être implémentées pour le contrôle d'accès dans une commande BOD :
- La classe proxy Protectable qui représente le nom.
- Des stratégies de contrôle d'accès autorisant l'accès des utilisateurs à la commande spécifique.
Classe proxy Protectable
Lorsque le gestionnaire PolicyManager appelle les méthodes sur l'objet encapsuleur Protectable, l'objet Protectable utilise le nom pour extraire des informations et renvoyer la réponse appropriée. Bien que certaines informations puissent être disponibles dans le nom (comme son propriétaire), la commande ne peut pas supposer que ces informations sont correctes. Cette hypothèse permet à la vérification de contrôle d'accès d'aboutir quand bien même cette information ne serait pas valide. L'objet encapsuleur Protectable est celui pouvant éclaircir le nom et la corrélation des informations avec la vérification d'autorisation.
Cette classe proxy doit être une extension de AbstractProtectableProxy et implémenter l'interface Protectable. La convention de dénomination de l'objet encapsuleur Protectable est la suivante :
com.mycompany.commerce.facade.server.authorization.noun_typeProtectableProxy
Lorsque le proxy Protectable est instancié, le nom et le contexte de commandes associés sont définis. Le nom peut être extrait par la méthode getObject() et le contexte de commandes via la méthode getCommandContext(). Deux méthodes doivent être implémentées pour chaque classe de proxy : fulfills(Long member, String relationship) et getOwner().
La méthode fulfills() est utilisée afin de vérifier si un membre donné entretient la relation spécifiée avec la ressource. Par exemple, le créateur d'une commande. Si fulfills() n'est pas implémentée explicitement, elle renvoie la valeur "false" depuis la version 7.0.0.1.
L'objet proxy Protectable est enregistré comme suit dans le fichier wc-component.xml :
<_config:authorization-configuration>
<_config:protectable-proxy
protectable="com.ibm.commerce.infrastructure.facade.server.authorization.WorkspaceTypeProtectableProxy"
interfacename="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType"/>
</_config:authorization-configuration>Stratégies de contrôle d'accès pour les services Get
Deux types de contrôle d'accès s'appliquent aux services Get :
- Autorisation de profil d'accès
- Ce type de contrôle d'accès détermine si l'utilisateur actuel, sous le contexte en cours, est autorisé à utiliser un profil d'accès spécifique. Un profil d'accès est comparable à une vue d'un objet et donc tous les utilisateurs ne devraient pas être autorisés à en visualiser les mêmes détails. L'action est basée sur le BOD et le profil d'accès. La ressource concernée est l'objet AccessProfileProtectableProxy. Le profil d'accès est représenté comme le nom du service (par exemple "GetCatalogEntry") suivi de ".NomProfilD'accès" (par exemple ".IBM_Admin_Details".Remarque : IBM_Admin_ figure en préfixe de tous les services destinés à être utilisés par les appels de service basés admin/CMC. Les profils d'accès non conformes aux nouvelles conventions de dénomination continuent à fonctionner correctement, la compatibilité ayant été maintenue avec les versions antérieures. Il est cependant recommandé de suivre ces conventions pour les profils d'accès existants et en cas de modification de profils d'accès futurs.Dans l'exemple ci-dessous, le service GetWorkspace comporte quatre profils d'accès distincts pour extraction d'un volume de données différent. Les profils d'accès IBM_Admin_Summary et IBM_Admin_Details y sont activés pour le groupe AllUsers, et les profils d'accès IBM_AdminDetails et IBM_Admin_All uniquement pour le groupe WorkspaceManagers.
<Policies> <!-- ================================== --> <!-- My Service Module Polices.xml --> <!-- Registers the access profiles of the service module --> <Action Name="GetWorkspace.IBM_Admin_Summary" CommandName="GetWorkspace.IBM_Admin_Summary"/> <Action Name="GetWorkspace.IBM_Admin_Details" CommandName="GetWorkspace.IBM_Admin_Details"/> <Action Name="GetWorkspace.IBM_Admin_All" CommandName="GetWorkspace.IBM_Admin_All"/> <Action Name="GetWorkspace.IBM_AdminDetails" CommandName="GetWorkspace.IBM_AdminDetails"/> <!-- The default resource category for all access profiles --> <ResourceCategory Name="com.ibm.commerce.foundation.server.authorization.policymanager.AccessProfileResourceCategory" ResourceBeanClass="com.ibm.commerce.foundation.server.authorization.policymanager.AccessProfileProtectableProxy"/> <!-- Grouping access profiles into user groups for access control policy registration --> <ActionGroup Name="Infrastructure-Workspace-AllUsers-AccessProfileActionGroup" OwnerID="RootOrganization"> <ActionGroupAction Name="GetWorkspace.IBM_Admin_Summary"/> <ActionGroupAction Name="GetWorkspace.IBM_Admin_Details"/> </ActionGroup> <ActionGroup Name="Infrastructure-Workspace-WorkspaceManagers-AccessProfileActionGroup" OwnerID="RootOrganization"> <ActionGroupAction Name="GetWorkspace.IBM_AdminDetails"/> <ActionGroupAction Name="GetWorkspace.IBM_Admin_All"/> </ActionGroup> <!-- Required for access profile access control registration. --> <ResourceGroup Name="AccessProfileResourceGroup" OwnerID="RootOrganization"> <ResourceGroupResource Name="com.ibm.commerce.foundation.server.authorization.policymanager.AccessProfileResourceCategory"/> </ResourceGroup> <!-- Defining the access control policies for the access profile grouping defined above --> <Policy Name="Infrastructure-Workspace-AllUsers-AccessProfilePolicy" OwnerID="RootOrganization" UserGroup="AllUsers" ActionGroupName="Infrastructure-Workspace-AllUsers-AccessProfileActionGroup" ResourceGroupName="AccessProfileResourceGroup" PolicyType="groupableStandard"/> <Policy Name="Infrastructure-Workspace-WorkspaceManagers-AccessProfilePolicy" OwnerID="RootOrganization" UserGroup="WorkspaceManagers" ActionGroupName="Infrastructure-Workspace-WorkspaceManagers-AccessProfileActionGroup" ResourceGroupName="AccessProfileResourceGroup" PolicyType="groupableStandard"/> <!-- Defining the policy group --> <PolicyGroup Name="ManagementAndAdministrationPolicyGroup" OwnerID="RootOrganization"> <PolicyGroupPolicy Name="Infrastructure-Workspace-AllUsers-AccessProfilePolicy" PolicyOwnerID="RootOrganization"/> <PolicyGroupPolicy Name="Infrastructure-Workspace-WorkspaceManagers-AccessProfilePolicy" PolicyOwnerID="RootOrganization"/> </PolicyGroup> </Policies> - Filtrage des résultats de lecture
- Pour chaque nom renvoyé par la commande FetchNounCmd, une vérification de contrôle d'accès pour Affichage est effectuée. L'action est figée dans le code en tant qu'affichage (Display). La ressource correspondante est l'objet proxy Protectable du nom renvoyé. Pour des considérations de performances, il est recommandé d'inclure dans la recherche des conditions d'habilitation afin de circonscrire les résultats de la recherche. Pour chaque résultat où le contrôle d'accès indique que l'utilisateur actuel ne dispose pas de l'autorisation Affichage sur la ressource, celle-ci est retirée de la liste. Par exemple, chaque nom pour lequel l'utilisateur ne dispose pas de l'autorisation d'affichage est retiré de la liste.Remarque : Le filtrage des résultats de lecture et le contrôle d'accès de ce filtrage sont facultatifs. Lorsque le filtrage de contrôle d'accès n'est pas requis, il est recommandé d'implémenter la méthode filterNouns() sur le contrôleur GetNounNameCmdImpl. Cette implémentation ne doit rien faire si ce n'est un renvoi. Ceci évite l'impact sur les performances d'une vérification de contrôle d'accès sur les résultats alors que celle-ci n'est pas requise. Ce filtre est nécessaire lorsque la logique métier pour extraction des objets métier n'évalue pas qui est autorisé à visualiser l'objet bien que ces objets ne devraient pas être visibles par tous les utilisateurs.
<Policies> <!-- how to register a resource for Get access control --> <!-- ================================================== --> <!-- My Service Module Polices.xml --> <!-- The action to register --> <Action Name="DisplayResourceAction" CommandName="Display"/> <ResourceCategory Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceTypeResourceCategory" ResourceBeanClass="com.ibm.commerce.infrastructure.facade.server.authorization.WorkspaceTypeProtectableProxy"/> <ActionGroup Name="DisplayResourceActionGroup" OwnerID="RootOrganization"> <ActionGroupAction Name="DisplayResourceAction"/> </ActionGroup> <!-- The resource group for the noun--> <ResourceGroup Name="Infrastructure-Workspace-ResourceGroup" OwnerID="RootOrganization"> <ResourceGroupResource Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceTypeResourceCategory"/> </ResourceGroup> <!-- The policy. The creator can display the object --> <Policy Name="Infrastructure-Workspace-AllUsers-CreatorPolicy" OwnerID="RootOrganization" UserGroup="AllUsers" ActionGroupName="DisplayResourceActionGroup" ResourceGroupName="Infrastructure-Workspace-ResourceGroup" RelationName="creator" PolicyType="groupableStandard"/> <!-- Register the policy --> <PolicyGroup Name="ManagementAndAdministrationPolicyGroup" OwnerID="RootOrganization"> <PolicyGroupPolicy Name="Infrastructure-Workspace-AllUsers-CreatorPolicy" PolicyOwnerID="RootOrganization"/> </PolicyGroup> </Policies>Remarque :
Stratégies de contrôle d'accès pour les services Change et Sync
Les stratégies de contrôle d'accès pour les services Change et Sync déterminent si l'utilisateur actuel sous le contexte en cours peut effectuer les actions de changement sur le nom spécifié. L'action est celle du code d'action dans l'expression de l'action à effectuer. La ressource correspondante est l'objet proxy Protectable du nom sur lequel elle opère.
<Policies>
<!-- how to register a resource for Change/Sync access control -->
<!-- ================================================== -->
<!-- My Service Module Polices.xml -->
<Action Name="ChangeResourceAction" CommandName="Change"/>
<ResourceCategory Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceTypeResourceCategory"
ResourceBeanClass="com.ibm.commerce.infrastructure.facade.server.authorization.WorkspaceTypeProtectableProxy"/>
<ActionGroup Name="ChangeResourceActionGroup" OwnerID="RootOrganization">
<ActionGroupAction Name="ChangeResourceAction"/>
</ActionGroup>
<!-- Resource group for the noun -->
<ResourceGroup Name="Infrastructure-Workspace-ResourceGroup" OwnerID="RootOrganization">
<ResourceGroupResource Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceTypeResourceCategory"/>
</ResourceGroup>
<Policy Name="Infrastructure-Workspace-AllUsers-CreatorPolicy"
OwnerID="RootOrganization" UserGroup="AllUsers" ActionGroupName="ChangeResourceActionGroup"
ResourceGroupName="Infrastructure-Workspace-ResourceGroup" RelationName="creator" PolicyType="groupableStandard"/>
<PolicyGroup Name="ManagementAndAdministrationPolicyGroup" OwnerID="RootOrganization">
<PolicyGroupPolicy Name="Infrastructure-Workspace-AllUsers-CreatorPolicy" PolicyOwnerID="RootOrganization"/>
</PolicyGroup>
</Policies>
Stratégies de contrôle d'accès pour les services Process
Les stratégies de contrôle d'accès pour les services Process déterminent si l'utilisateur actuel sous le contexte en cours est autorisé à effectuer l'action sur le nom . L'action est celle du code d'action présent dans le verbe Process dans le BOD. La ressource correspondante est l'objet proxy Protectable du nom sur lequel elle opère.
<Policies>
<!-- how to register a resource for process access control -->
<!-- ============================================= -->
<!-- My Service Module Polices.xml -->
<Action Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType.create"
CommandName="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType.create"/>
<Action Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType.promote"
CommandName="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType.promote"/>
<Action Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType.cancel"
CommandName="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType.cancel"/>
<!-- Mapping the category to the protectable proxy that represents the noun. -->
<ResourceCategory Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceTypeResourceCategory"
ResourceBeanClass="com.ibm.commerce.infrastructure.facade.server.authorization.WorkspaceTypeProtectableProxy"/>
<ActionGroup Name="Infrastructure-Workspace-WorkspaceManagers-ActionGroup" OwnerID="RootOrganization">
<ActionGroupAction Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType.create"/>
<ActionGroupAction Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType.promote"/>
<ActionGroupAction Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceType.cancel"/>
</ActionGroup>
<ResourceGroup Name="Infrastructure-Workspace-ResourceGroup" OwnerID="RootOrganization">
<ResourceGroupResource Name="com.ibm.commerce.infrastructure.facade.datatypes.WorkspaceTypeResourceCategory"/>
</ResourceGroup>
<!-- The policy. The creator of the resource and execute actions defined in the workspace managers action group.-->
<Policy Name="Infrastructure-Workspace-WorkspaceManagers-CreatorPolicy"
OwnerID="RootOrganization" UserGroup="WorkspaceManagers"
ActionGroupName="Infrastructure-Workspace-WorkspaceManagers-ActionGroup"
ResourceGroupName="Infrastructure-Workspace-ResourceGroup"
RelationName="creator" PolicyType="groupableStandard"/>
<PolicyGroup Name="ManagementAndAdministrationPolicyGroup" OwnerID="RootOrganization">
<PolicyGroupPolicy Name="Infrastructure-Workspace-WorkspaceManagers-CreatorPolicy"
PolicyOwnerID="RootOrganization"/>
</PolicyGroup>
</Policies>