Unified security
Cet article a pour objectif de documenter le fonctionnement de la sécurité unifiée. Aujourd’hui, les modules utilisant ce type de sécurité sont :
- Workflow
- Réservoirs de données
- Studio
- Agents
- SSO
Récupération du Controller de sécurité
Depuis le module adéquat, vous pouvez récupérer ce controller via la méthode getSecurityController()
. Cette méthode vous renverra un objet implémentant ISecurityController.
L’interface ISecurityController intègre encore beaucoup de méthode deprecated, méthodes utilisées pour les modules utilisant encore l’ancienne sécurité.
Sur cet objet, vous pourrez alors effectuer :
- Des tests de sécurité : checkPermission, hasPermission
- Des ajouts, suppressions de droits : addPermission, removePermission
- Des cassages d’héritages : breakInheritance
Pour rappel, l’usage du ISecurityController pour ce qui est des tests de lecture sur des éléments SDK est quasiment superflu. En effet, la notion de IContext dans le SDK réalise elle-même des tests de sécurité implicites : je ne récupère que la liste des objets autorisés par mon contexte.
Structure de la sécurité
Les types de droits
Voici la liste des niveaux de droits applicables (ils sont présents dans l’interface IPermissionLevel).
Type de droits | Mapping dans le SDK | Description |
---|---|---|
Aucun | NO | Aucune permission |
Lecture | READ | Droit de lecture |
Modification | WRITE | Droit de modification |
Propriétaire | OWNER | Droits de modification et de suppression |
Contrôle total | GRANT | Droits de modification, de suppression et de modification des droits |
Les options supplémentaires, associées aux droits
Voici la liste des options, en complément des niveaux de droits (ils sont présents dans l’interface IPermissionFlags).
Cette interface intègre des sous-interfaces, chacune intégrant des attributs différents et héritant de CommonPermissionFlags :
Interface | Flag(s) |
---|---|
CommonPermissionFlags | CREATE : création |
AgentPermissionFlags | EXECUTE : exécution |
WorkflowCatalogPermissionFlags | ALLOW_ACCESS : accès à l’application |
WorkflowContainerPermissionFlags | LIFE_CYCLE_MANAGE : gestion du cycle de vie sur n’importe quel sous-workflow |
WorkflowPermissionFlags | |
ViewPermissionFlags | |
WorkflowInstancePermissionFlags |
|
DatabasePermissionFlags | |
TablePermissionFlags |
Manipulation de la sécurité
La bonne pratique
Pour manipuler la sécurité, il faut commencer par récupérer un ISecurityController sur l’objet sur lequel on souhaite travailler (c’est un ISecuritySupport).
Pour savoir quel objet passer ici, il faut se demander sur quel élément on souhaite éditer cette sécurité ?
Ensuite, il est possible de manipuler la sécurité en travaillant sur :
- Un niveau de droits (IPermissionLevel)
- Un ou plusieurs flags (facultatifs) (IPermissionFlag)
Exemples
Sur un groupe de processus
Ajout de droit
Sur un groupe de processus, ajouter un droit de modification des documents (options : création d’un document) :
IWorkflowModule iWorkflowModule = getWorkflowModule();
ICatalog iCatalog = ...;
IUser iUser = iWorkflowModule.getUserByLogin("sboirol");
ISecurityController iSecurityController = iWorkflowModule.getSecurityController(iCatalog);
iSecurityController.addPermission(iUser, IWorkflowInstance.class, IPermissionLevel.WRITE, IPermissionFlag.CREATE);
Sur un document de processus
Tester les droits
Sur un document de processus, tester si un utilisateur a les droits d’écritures avec l’option de création :
IWorkflowModule iWorkflowModule = getWorkflowModule();
IWorkflowInstance iWorkflowInstance = ...;
IUser iUser = iWorkflowModule.getUserByLogin("sboirol");
ISecurityController iSecurityController = iWorkflowModule.getSecurityController(iWorkflowInstance);
iSecurityController.checkPermission(iUser, IPermissionLevel.WRITE, IPermissionFlag.CREATE);
Affecter des droits
Sur un document de processus, affecter un droit de modification et d’action pour “Tout le monde” avec un filtre organisationnel et sans filtre de localisation :
ISecurityController iSecurityController = getWorkflowModule().getSecurityController(workflowInstance);
iSecurityController.addPermission(ISecurityController.EVERYONE, IPermissionLevels.WRITE, IScopeFilters.CHILDREN, organization, IScopeFilters.NONE, null, IPermissionFlags.WorkflowInstancePermissionFlags.CHANGE_STATE);
Sur un groupe
Deleting a permission
By using a security controller you may remove the rights of a user, a group on an object. The following example shows how to remove the modifications rights on the object “entity” of the group “users”.
public void security_removeRights( IDirectoryModule directoryModule, IOrganization entity, IGroup users ) throws DirectoryModuleException {
// Adjusting rights ISecurityController entitySecurity = directoryModule.getSecurityController( entity );
// The group "Users" should not have the right to manage organizations of the entity.
entitySecurity.removePermission( users, IPermissionLevels.WRITE );
}
Manage security on custom objects
The development of security on external objects have been made to be able to restrict access to external data (Ex: read database tables).
Apply Visiativ Process security on custom objects
It’s possible to apply Visiativ Process security on a custom object by implementing the IChildSecuritySupport. The IChildSecuritySupport class will handle complex security for custom object (with inheritance).
The getSecurityParent()
method will return the security parent of the object for security inheritance.
Example - Apply security on a local folder:
import com.axemble.vdoc.sdk.Modules;
import com.axemble.vdoc.sdk.exceptions.DirectoryModuleException;
import com.axemble.vdoc.sdk.exceptions.ModuleException;
import com.axemble.vdoc.sdk.exceptions.SDKException;
import com.axemble.vdoc.sdk.interfaces.IContext;
import com.axemble.vdoc.sdk.interfaces.IOrganization;
import com.axemble.vdoc.sdk.modules.IDirectoryModule;
import com.axemble.vdoc.sdk.supports.IChildSecuritySupport;
import com.axemble.vdoc.sdk.supports.ISecuritySupport;
import java.io.File;
public class CustomFolderObject implements IChildSecuritySupport {
private String name;
private String label;
public File myFolder;
public final static String SYSADMIN_LOGIN = "sysadmin";
public CustomFolderObject(String name) {
super();
this.name = name;
this.label = name + " Label";
String pathname = "C:\\";
myFolder = new File(pathname);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
@Override
public String getProtocolURI() {
try {
return Modules.getPortalModule().getProtocolURI(this);
} catch (ModuleException e) {
throw new SDKException(e);
}
}
@Override
public String getProtocolURI(boolean useNames) {
try {
return Modules.getPortalModule().getProtocolURI(this, useNames);
} catch (ModuleException e) {
throw new SDKException(e);
}
}
@Override
public ISecuritySupport getSecurityParent() {
// In this situation, the parent is the organization by default.
IDirectoryModule directoryModule = Modules.getDirectoryModule();
IContext sysadminContext = directoryModule.getContextByLogin(SYSADMIN_LOGIN);
IOrganization folderOrganization;
try {
folderOrganization = directoryModule.getOrganization(sysadminContext, "DefaultOrganization");
return folderOrganization;
} catch (DirectoryModuleException e) {
throw new SDKException(e);
}
}
}
Source : https://wiki.myvdoc.net/xwiki/bin/view/Dev+Floor/ReferenceUnifiedSecurity