Récemment, je me suis retrouvé dans une situation où un utilisateur avait des rôles qui lui accordaient des rôles supplémentaires, etc.
Comme je ne comprenais pas d'où venait une autorisation particulière, j'ai écrit ce code qui obtient un ensemble initial de rôles et les décompresse de manière récursive, en tenant compte des éventuelles répétitions.
/// Décompresse de manière récursive le jeu de rôles.
/// Tient compte des dépendances circulaires et des répétitions.
Class Utils.Roles
{
/// roles : chaîne de rôles séparés par des virgules
/// showResources : affiche les ressources en plus des rôles
/// do ##class(Utils.Roles).Display
ClassMethod Display(roles As %String, showResources As %Boolean = {$$$NO})
{
new $namespace
set $namespace = "%SYS"
set roles = $lfs(roles)
set i=0
while i<$ll(roles) {
do $i(i)
set role = $lg(roles, i)
continue:$d(processed(role))=1
write "Current role: ", role,!
write "Grants roles: "
set sc = ##class(Security.Roles).Get(role, .p)
for j=1:1:$l($g(p("GrantedRoles")),",") {
set grantedrole = $p(p("GrantedRoles"),",", j)
continue:grantedrole=""
continue:$lf(roles, grantedrole)
write grantedrole, ", "
set roles = roles _ $lb(grantedrole)
}
write:showResources !, "Grants resources: ", p("Resources")
write !
}
}
}
Code.