Table of Contents

Class PermissionReflectionScanner

Namespace
KadicAuth.Application.Permissions.Seeding
Assembly
KadicAuth.Application.dll

Recorre por reflexión la clase estática KadicErp.Core.Abstractions.Authorization.Permissions y convierte cada submódulo y constante en un PermissionSeedEntry.

Convención: - Clase anidada de nivel 1 marcada con KadicErp.Core.Abstractions.Authorization.PermissionModuleAttribute = módulo. - Clase anidada de nivel 2 (p. ej. Permissions.RentACar.RentalTypes) = submódulo. - Miembros public const string dentro de un submódulo = códigos de permiso.

El ModuleKey lo declara el propio módulo vía atributo, junto a sus permisos. Antes vivía en un diccionario compilado aquí mismo (KadicAuth.Application.Permissions.Seeding.PermissionReflectionScanner.ModuleKeyMap) y una clase ausente de ese diccionario se saltaba en silencio. Ese silencio tenía dos consecuencias encadenadas: sus permisos nunca llegaban a la base de datos, y además el diff los contaba como huérfanos por no encontrarlos en la salida del escáner. Usa ScanUnmapped() para obtener justo lo que antes se perdía.

public static class PermissionReflectionScanner
Inheritance
object
PermissionReflectionScanner

Methods

ScanAll()

Produce la lista completa de permisos declarados en KadicErp.Core.Abstractions.Authorization.Permissions, agrupados por la clave del módulo que los declara.

public static List<PermissionSeedEntry> ScanAll()

Returns

List<PermissionSeedEntry>

ScanUnmapped()

Devuelve las clases de permisos cuyos códigos no llegan a la base de datos, con el motivo por el que se pierden. Lo que antes era un continue silencioso.

public static List<UnmappedModuleClass> ScanUnmapped()

Returns

List<UnmappedModuleClass>

Remarks

Existen dos formas de perder permisos, y conviene distinguirlas porque se arreglan de manera distinta:

  • MissingAttribute — la clase no se declaró como módulo. Se arregla poniéndole KadicErp.Core.Abstractions.Authorization.PermissionModuleAttribute.
  • ConstantsAtModuleLevel — la clase sí es un módulo, pero declara constantes directamente en el nivel 1, sin clase de submódulo que las contenga. El escáner busca submódulos en el nivel 2, así que esas constantes no las recoge nadie. Se arregla agrupándolas en un submódulo.