Recorrer roles de forma recursiva
Recientemente me encontré en una situación en la que un usuario tenía algunos roles, que le otorgaban roles adicionales, y así sucesivamente.
Como no entendía de dónde venía un permiso en particular, escribí este código que obtiene un conjunto inicial de roles y los recorre recursivamente, teniendo en cuenta cualquier repetición.
/// Recursively unwraps roleset./// Accounts for circular dependencies and repeats.Class Utils.Roles
{
/// roles: comma-separated string of roles/// showResources: show resources in addition to roles./// do ##class(Utils.Roles).DisplayClassMethod Display(roles As%String, showResources As%Boolean = {$$$NO})
{
new$namespaceset$namespace = "%SYS"set roles = $lfs(roles)
set i=0while i<$ll(roles) {
do$i(i)
set role = $lg(roles, i)
continue:$d(processed(role))=1write"Current role: ", role,!
write"Grants roles: "set sc = ##class(Security.Roles).Get(role, .p)
forj=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
En realidad no me fue de demasiada ayuda porque el rol que buscaba lo otorgaba una aplicación web ¯\_(ツ)_/¯
Pero quién sabe, quizá sirva para ayudar a alguien.
Code.
Comentarios (0)0