Control de acceso en la infraestructura de mandato BOD

Como en las versiones anteriores de HCL Commerce, las comprobaciones de control de acceso en la infraestructura de mandato de BOD se llevan a cabo justo antes de que se ejecute la lógica de empresa. Esta infraestructura sigue utilizando HCL Commerce PolicyManager como motor de control de acceso predeterminado. Las políticas de control de acceso todavía son necesarias para otorgar acceso a los usuarios a mandatos y recursos. Con todo, la convención de denominación de acción y recurso es diferente de la infraestructura de mandato BOD.

Los recursos sobre los que actúan los mandatos BOD son nombres representados generados por objetos Java generados. Esos objetos Java generados no implementan la interfaz Protectable que necesita el Gestor de políticas. Para abordar este requisito, debe implementarse un objeto derivador para cada nombre para extraer la información requerida por PolicyManager para llevar a cabo comprobaciones de autorización. Esta correlación se define en el archivo wc-component.xml. En el caso de mandatos de pares nombre-valor de SOI, antes de ejecutarse, se lleva a cabo una autorización de nivel de mandato y de nivel de recurso. En la infraestructura de mandato de BOD, solo se llevan a cabo comprobaciones de control de acceso de nivel de recursos, excepto para solicitudes Get, en las que Get lleva a cabo una comprobación de control de acceso sobre si la solicitud puede utilizar el perfil de acceso especificado. El perfil de acceso indica la vista de los datos y determinadas vistas pueden limitarse a determinados tipos de usuarios. Esto es suficiente para comprobar si un usuario puede ejecutar el mandato contra un recurso específico.

Existen dos elementos que deben implementarse para el control de acceso de un mandato BOD:

  • La clase Protectable que representa el nombre
  • Las políticas de control de acceso que otorgan al usuario acceso al mandato particular.

Clase proxy Protectable

Cuando PolicyManager invoca los métodos del objeto derivador Protectable, el objeto Protectable utiliza el nombre para recuperar información para devolver la respuesta adecuada. Aunque es posible que parte de la información se encuentre disponible en el nombre, como por ejemplo el propietario, el mandato no puede suponer que esta información sea correcta. Esta suposición permite llevar a cabo la comprobación de control de acceso aunque pueda ser inválida. Es el objeto wrapper protegible el que comprende el nombre y cómo se correlaciona la información con la comprobación de autorización.

Esta clase proxy debe ampliarse desde la clase AbstractProtectableProxy e implementar la interfaz Protectable. El convenio de denominación del objeto derivador protegible es el siguiente:


com.mycompany.commerce.facade.server.authorization.noun_typeProtectableProxy

Cuando se crea una instancia del proxy protegible, se establece el nombre y el contexto de mandato asociado. El método getObject() puede recuperar el nombre y el método getCommandContext() puede recuperar el contexto del mandato. Existen dos métodos que deben implementarse para cada clase proxy – fulfills(Long member, String relationship) y getOwner().

El método fulfills() se utiliza para comprobar si un miembro determinado tiene la relación especificada con el recurso. Por ejemplo, el creador de un pedido. Si no se implementa explícitamente fulfills(), devolverá "false", a partir de 7.0.0.1.

El método getOwner() se utiliza para devolver el miembro propietario del recurso. Por ejemplo, la organización que posee el pedido. El propietario debe recuperarse de la base de datos o de dónde esté almacenado. La mayoría de los recursos de HCL Commerce son propiedad de una tienda, y en este caso, el valor que se devuelve en este método es la organización que posee la tienda. Si el método getOwner() no se implementa explícitamente, se devolverá la organización del propietario de la tienda.
Nota: El ID de tienda no debería recuperarse del contexto de mandato ya que el cliente puede cambiarlo. El ID de tienda se recupera de la capa de persistencia, mediante el identificador del nombre. Es decir, ya que el propietario de un objeto suele ser el propietario de la tienda en que se encuentra el objeto, no resulta seguro sacar la tienda del contexto y devolver el propietario de las tiendas. El identificador del objeto debe utilizarse para buscar a su propietario en la base de datos.

El objeto proxy protegible se registra del modo siguiente en el archivo 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>

Políticas de control de acceso para servicios Get

Existen dos tipos de control de acceso para los servicios Get:

Autorización de perfil de acceso
Este tipo de control de acceso determina si el usuario actual, en el contexto actual, tiene permiso para utilizar un perfil de acceso determinado. Un perfil de acceso es como una vista de un objeto, y no todos los usuarios deben tener permiso para ver los mismos detalles de objeto. La acción se basa en el BOD y el perfil de acceso. El recurso es el objeto AccessProfileProtectableProxy. El perfil de acceso se indica mediante el nombre del servicio, por ejemplo, "GetCatalogEntry", seguido de ".AccessProfileName", por ejemplo, ".IBM_Admin_Details".
Nota: IBM_Admin_ es el prefijo de todos los servicios pensados para ser utilizados por llamadas de servicios basadas en admin/CMC. Los perfiles de acceso que no sigan los nuevos convenios de denominación continuarán funcionando correctamente, ya que se mantiene la compatibilidad con las versiones anteriores. No obstante, se recomienda seguir dichos convenios para los perfiles de acceso existentes y al realizar cambios en los perfiles de acceso futuros.
En este ejemplo, el servicio GetWorkspace tiene cuatro perfiles de acceso diferentes para recuperar diferentes importes de datos. Los perfiles de acceso IBM_Admin_Summary e IBM_Admin_Details se están habilitando para AllUsers, y los perfiles de acceso IBM_AdminDetails e IBM_Admin_All se están habilitando únicamente para 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>
Filtrado de resultados de lectura
Para cada nombre devuelto por FetchNounCmd, se lleva a cabo una comprobación de control de acceso de visualización. La acción de visualización (Display) está codificada sin posibilidad de modificación. El recurso es el objeto proxy protegible del nombre devuelto. Por motivos de rendimiento, es recomendable que la búsqueda incluya condiciones de titularidad para reducir los resultados de la búsqueda. Para cada resultado en el que el control de acceso indica que el usuario actual no tiene autorización de visualización (Display) sobre el recurso, el recurso se elimina de la lista. Por ejemplo, para cada nombre, si el usuario no tiene permiso de visualización, el nombre se elimina de la lista.
Nota: Filtrado El filtrado de resultados de lectura y el control de acceso para el filtrado de resultados de lectura son opcionales. En los casos en los que este filtrado de control de acceso no es necesario, es recomendable implementar el método filterNouns() en el controlador GetNounNameCmdImpl. Lo único que debería hacer la implementación es devolver. Esto evita la sobrecarga de rendimiento que supondría realizar una comprobación de control de acceso en el resultado en los casos en los que no es necesaria. Este filtro es necesario en los casos en los que la lógica de empresa para recuperar los objetos de empresa no tiene en cuenta quién tiene permiso para ver el objeto. Sin embargo, no todo el mundo debe poder ver estos objetos.
<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> 
Nota:

Políticas de control de acceso para servicios Change y Sync

Las políticas de control de acceso para los servicios de cambio y sincronización determinan si el usuario actual en el contexto actual puede llevar a cabo las acciones de cambio en el nombre especificado. La acción es actionCode en la expresión de acción que debe llevarse a cabo. El recurso es el objeto proxy protegible del nombre sobre el que se opera.

<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>

Políticas de control de acceso para servicios Process

Las políticas de control de acceso para los servicios de proceso determinan si el usuario actual tiene permiso para ejecutar la acción en el nombre. La acción es el código de acceso que se encuentra en el verbo Process del BOD. El recurso es el objeto proxy protegible del nombre sobre el que se opera.

<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>