Article
· Août 28 2m de lecture

Décompresse les rôles de manière récursive

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

}
 
Spoiler

Code.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer