using Microsoft.AspNetCore.Authorization; namespace ROLAC.API.Authorization; /// /// Gates an action/controller on a configurable permission. Usage: /// [HasPermission(Modules.Members, PermissionActions.Write)]. /// Encodes the policy name PERM:<module>:<action>, which /// turns into a . /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public class HasPermissionAttribute : AuthorizeAttribute { public const string PolicyPrefix = "PERM:"; public HasPermissionAttribute(string module, string action) => Policy = $"{PolicyPrefix}{module}:{action}"; /// Parses a policy name back into (module, action), or null if not a PERM policy. public static (string Module, string Action)? Parse(string policyName) { if (!policyName.StartsWith(PolicyPrefix, StringComparison.Ordinal)) return null; var body = policyName[PolicyPrefix.Length..]; var split = body.IndexOf(':'); if (split <= 0 || split == body.Length - 1) return null; return (body[..split], body[(split + 1)..]); } }