|
|
@@ -15,15 +15,14 @@ interface Condition {
|
|
|
/**
|
|
|
* Classe permettant de mener des opérations sur les habilités
|
|
|
*/
|
|
|
-class AbilityUtils {
|
|
|
+class AbilityBuilder {
|
|
|
private readonly ability: MongoAbility = {} as MongoAbility
|
|
|
private readonly accessProfile: any
|
|
|
private readonly organizationProfile: any
|
|
|
|
|
|
private readonly configDir = './config/abilities/config.yaml'
|
|
|
|
|
|
- private abilitiesByRoles: Array<AbilitiesType> = []
|
|
|
- private abilitiesByConfig: Array<AbilitiesType> = []
|
|
|
+ private abilities: Array<AbilitiesType> = []
|
|
|
|
|
|
/**
|
|
|
* @constructor
|
|
|
@@ -56,13 +55,11 @@ class AbilityUtils {
|
|
|
}: any) => {
|
|
|
after((result: any)=>{
|
|
|
if (name === 'setProfile'){
|
|
|
- //On récupère les habilités
|
|
|
- const abilities = this.buildAbilities();
|
|
|
+ //On construit les habilités
|
|
|
+ this.buildAbilities();
|
|
|
|
|
|
//On les store puis on update le service ability pour le mettre à jour.
|
|
|
- this.accessProfile.abilities = abilities
|
|
|
-
|
|
|
- this.ability.update(abilities)
|
|
|
+ this.accessProfile.abilities = this.abilities
|
|
|
|
|
|
// Unsubscribe pour éviter les memory leaks
|
|
|
unsubscribe()
|
|
|
@@ -77,28 +74,29 @@ class AbilityUtils {
|
|
|
*
|
|
|
* @return {Array<AbilitiesType>}
|
|
|
*/
|
|
|
- buildAbilities(): Array<AbilitiesType> {
|
|
|
- this.buildAbilitiesFromRoles()
|
|
|
- this.buildAbilitiesFromConfig()
|
|
|
-
|
|
|
- return this.abilities()
|
|
|
- }
|
|
|
-
|
|
|
- abilities(): Array<AbilitiesType> {
|
|
|
- return ([] as Array<AbilitiesType>).concat(this.abilitiesByRoles).concat(this.abilitiesByConfig)
|
|
|
+ buildAbilities() {
|
|
|
+ // Build from roles
|
|
|
+ this.abilities = this.buildAbilitiesFromRoles()
|
|
|
+ this.ability.update(this.abilities)
|
|
|
+
|
|
|
+ // Build from config
|
|
|
+ this.abilities = this.abilities.concat(this.buildAbilitiesFromConfig())
|
|
|
+ this.ability.update(this.abilities)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Adaptation et transformations des roles symfony en abilities Casl
|
|
|
*/
|
|
|
buildAbilitiesFromRoles() {
|
|
|
- this.abilitiesByRoles = RoleUtils.rolesToAbilities(this.accessProfile.roles)
|
|
|
+ return RoleUtils.rolesToAbilities(this.accessProfile.roles)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Charge les habilités depuis les fichiers de configuration
|
|
|
*/
|
|
|
buildAbilitiesFromConfig() {
|
|
|
+ const abilitiesByConfig: Array<AbilitiesType> = []
|
|
|
+
|
|
|
const doc = YamlDenormalizer.denormalize({path: this.configDir})
|
|
|
const fromConfig = doc.abilities
|
|
|
|
|
|
@@ -111,9 +109,11 @@ class AbilityUtils {
|
|
|
}
|
|
|
|
|
|
if (this.hasConfigAbility(conditions as Array<Condition>, subject)) {
|
|
|
- this.abilitiesByConfig.push({ action, subject })
|
|
|
+ abilitiesByConfig.push({ action, subject })
|
|
|
}
|
|
|
})
|
|
|
+
|
|
|
+ return abilitiesByConfig
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -179,10 +179,7 @@ class AbilityUtils {
|
|
|
* @param ability
|
|
|
*/
|
|
|
hasRoleAbility(ability: AbilitiesType): boolean {
|
|
|
- return this.abilitiesByRoles.some((candidate: AbilitiesType) => {
|
|
|
- return candidate.subject === ability.subject &&
|
|
|
- (candidate.action === ability.action || candidate.action === 'manage') // 'manage' permet aussi l'action 'read'
|
|
|
- })
|
|
|
+ return this.ability.can(ability.action, ability.subject)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -308,4 +305,4 @@ class AbilityUtils {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-export default AbilityUtils
|
|
|
+export default AbilityBuilder
|