cas-heimdall-authzen
Skill11k starsChanged yesterdayApache-2.0View on GitHub
Review and change Heimdall authorization and its AuthZEN PDP endpoints (support/cas-server-support-heimdall*): request parsing, caller authentication, policies (JDBC, JSON resources), evaluations, PDP metadata, throttling and the heimdall-authzen/heimdall-nginx scenarios. Use when touching Heimdall code, docs or scenarios.
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 10
Check the latest OpenID Authorization API final specification and editor's draft.
- Very specific: line 29
Create registry-backed single-use markers through the TicketFactory (TST factory, custom ExpirationPolicy in a *mutable* properties map: …
- Distinctive: line 73
Read shared helpers before reporting leaks: request headers already filter credentials and the request principal is JSON-ignored.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Heimdall and AuthZEN
Heimdall / AuthZEN review discipline
- Check the latest OpenID Authorization API final specification and editor's draft. AuthZEN is a PEP/PDP protocol; wallet exchange uses OID4VCI/OID4VP. Treat a verified-presentation-to-policy bridge as a feature.
- Trace
DefaultAuthorizationPrincipalParserthroughDefaultAuthorizationEngineand each policy. A valid caller token does not establish PDP audience, PEP permissions or DPoP proof possession; delegated subject ids are legitimate for trusted PEPs and are not inherently impersonation. - An AuthZEN
resource.idnames the resource instance, never a policy namespace. AuthZEN requests (AuthorizationRequest.isAuthZen(): subject, resource and action all present) matchresourceType,actionsand an optional full-matchresourceIdPatternacross every namespace, and every match must grant. Normal requests keep namespace + URI pattern + method and/heimdall/authorizerejects AuthZEN fields, which keeps the paths apart. - Callers authenticate with tokens issued to a registered OAuth/OIDC service whose access strategy allows
access;
HeimdallRegisteredServiceAccessStrategy(alone or chained) can refuse it. DPoP andx509_digestcertificate bindings are enforced.x509_digestis the RFC 8705x5t#S256thumbprint (base64url SHA-256 of the DER certificate); compute it only withOAuth20Utils.computeCertificateThumbprintso issuer and verifiers agree. On AuthZEN, Basic meansclient_id:client_secret(reject clients without secrets:DefaultOAuth20ClientSecretValidator.validatereturns true when none is defined); on/heimdall/authorizeit stays CAS user credentials, split on the first colon. Both endpoints are throttled;HeimdallThrottledHandlerInterceptorforwards only 401s to the throttle interceptors' post-processing. AThrottledRequestFiltercannot limit what counts: the defaulthttpPost()filter claims every POST and the plan combines filters withanyMatch, and the interceptors record every non-2xx response (twice:postHandleandafterCompletion; harmless for decisions, since stores keep the latest failure per key or read the authentication audit trail). Create registry-backed single-use markers through theTicketFactory(TST factory, customExpirationPolicyin a mutable properties map:buildExpirationPolicyremoves that key, soMap.ofthrows), never by instantiating ticket implementations. - macOS JDKs use a polling
WatchService(2s): a file created and deleted between two polls produces no event. Watcher-driven caches must reconcile against the file system on every event rather than trust event kinds. JWT assertions needjti/iat, are single-use, and share the token endpoint's audiences on purpose. A resource without policies denies. - JDBC trusted parameters (
principal,method,uri,namespaceand the AuthZEN names) are added after context and attributes, so they already win; an overwrite claim there was a false finding. Check that policy file deletion removes cached grants.enforceAllPolicies=falsemeans any one policy grants: a failing policy is logged and skipped, and failures are rethrown only when nothing grants (never turn them into a silent deny).enforceAllPolicies=truestops at the first denial or failure. An empty policy list denies before either runs. - JDBC policies resolve their
DataSourceby bean name (dataSourceName, elseheimdallJdbcDataSource-<sha256(url|username)>) and register aJpaBeans.newPoolingDataSourcepool (Hikari defaults,minimumIdle=0) throughGenericApplicationContext.registerBeanunder a lock, so Spring closes it on shutdown. Never cache a pool on a policy instance (policies are rebuilt on every file reload) and never useregisterSingletonfor closeable beans: Spring gives registered singletons no destruction callbacks. The pool key ignores the password (a rotated password needs a newdataSourceNameor a restart; documented).queryTimeout(defaultPT5S) is set on theJdbcTemplate. Tests overrideresolveApplicationContext()with a local context rather than relying on the staticApplicationContextProvider, which parallel tests share. JsonAuthorizableResourceRepositorypublishes one immutableResourceIndex(by namespace and by AuthZENresourceType) per reload; AuthZEN lookups use the type index, so keep both maps in the same snapshot.- Policies evaluate sequentially; do not reintroduce
parallelStream()(blocking policies starvecommonPool). - AuthZEN subjects are resolved through the principal resolver only for subject type
user(hardcoded); other types become a bare principal. Policies read request data throughAuthorizationRequest.resolveAttributeValues(qualifiedsubject.*,resource.*,action.*,context.*names); never merge caller-supplied properties into principal attributes, which would let a PEP override the directory. AuthZENcontextis body-only;/heimdall/authorizeadds non-protocol headers withputIfAbsent. - Palantir rebuilds resources from a fixed field list (
heimdallResourceForStorage) and re-saves the whole namespace; any newAuthorizableResourcefield must be added there or an edit silently drops it. - AuthZEN PDP metadata: the identifier is
<prefix>/heimdall, served at/cas/heimdall/.well-known/authzen-configuration(HeimdallAuthZenConfigurationController). The spec inserts the well-known segment after the host (/.well-known/authzen-configuration/cas/heimdall), outside the CAS context: deployments need a proxy or ENGINE rewrite-valve rule, as in theheimdall-authzenscenario'srewrite.config.policy_decision_pointmust equal the identifier the PEP started from. List only endpoints that exist (no search yet). - AuthZEN decision context: denials carry
context.reasonfromAuthorizationDecisionReason(set by the engine:subject_unresolved,no_matching_resource,no_policies,policy_denied); grants carry no context. Never put policy names, attribute names or messages in it; details go to DEBUG logs. Search (R5) and the OID4VP wallet bridge (R7) are deferred and noted as future work in the Heimdall and verifiable credentials docs. - AuthZEN evaluations (
/heimdall/authzen/evaluations): top-level subject/resource/action/context are defaults that an entry replaces per key. Authenticate the caller once (authenticateCaller), thenresolveSubjectper entry; never callparseper entry (it would consume single-use JWT assertions). Per-entry failures aredecision:falsewithcontext.error.{status,message}(no exception text for 500s); short-circuit semantics omit the remaining entries; no/emptyevaluationsfalls back to the single evaluation. Evaluations run sequentially. - AuthZEN evaluated denials use HTTP 200 with
decision:false; authentication failures use 401. Discovery/batch/search are separate capabilities, and the specification's example endpoint path is not mandatory. - Read shared helpers before reporting leaks: request headers already filter credentials and the request principal is JSON-ignored. Confirm performance severity with evidence; blocking policy parallel streams and unpooled JDBC merit investigation, not an unmeasured claim of outage.
- Puppeteer scenario
heimdall-authzencovers the AuthZEN endpoint end to end (decisions across namespaces, id patterns, deny-wins, empty policies,X-Request-ID, unknown fields, 400/401, the Heimdall access strategy, client-credential and bearer PEPs, the legacy endpoint, the actuator and throttling). It also enables throttling, so keep 401-producing steps at least one throttle window apart. Palantir scenarios only check that tabs load. - Scenario
heimdall-nginxdrives the shared nginx config (ci/tests/nginx) as a PEP:/apiusesauth_requestagainst/heimdall/authorize. The subrequest must setproxy_method POST(it is a GET otherwise) and send anamespace; nginx does not escape variables inproxy_set_body, so URIs with"or\are rejected by amap.auth_requestmaps any status other than 2xx/401/403 (such as Heimdall's 404) to 500. Validate edits with a localnginx -tand stub upstreams; the config resolveshost.docker.internalat load time.
Trending
Quiet since August.about the whole repository
Who's talking about apereo/cas
- Stack Overflow“What is the relation between CAS vs SAML?”Stack Overflow · Apr 28, 2017 · 23 votes
- strapi/strapi“Add support for login via cas - github.com/apereo/cas”GitHub · Sep 26, 2020 · 8 reactions
- Stack Overflow“Opensaml error receiving correct unmarshaller”Stack Overflow · Apr 10, 2017 · 6 votes
- Stack Overflow“How to enable file-based authentication in CAS 5”Stack Overflow · Apr 14, 2017 · 5 votes
- google/error-prone“ErrorProne 2.37: StringConcatToTextBlock causes java.util.NoSuchElementException”GitHub · Mar 19, 2025 · 3 reactions
The biggest 5 of 27 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 27
Talked about on Stack Overflow, GitHub, Hacker News and the web (27 times).
On Stack Overflow · 14
- Apr 28, 2017What is the relation between CAS vs SAML?23 votes
- Apr 10, 2017Opensaml error receiving correct unmarshaller6 votes
- Apr 14, 2017How to enable file-based authentication in CAS 55 votes
- Aug 2, 2021How to create a SAML IDP that authenticates with an API from scratch2 votes
- Feb 3, 2020CAS 6.1 - State Parameter null with Pac4J2 votes
9 more on Stack Overflow
- Jul 4, 2017CAS Spnego - KrbException: Checksum failed2 votes · 3 answers
- Dec 11, 2023What happened "org.apereo.cas.web.security" in 7.0.0-RC9 of org.apereo.cas?1 vote
- Jul 23, 2020Cas - configure Principal transformation1 vote · 1 answer
- Nov 25, 2019CAS Disable Service X-Frame-Options not work1 vote
- Apr 24, 2019inject model data into spring webflow in cas1 vote
- Mar 4, 2019Prevent CAS authentication if X.509 user isn't registered1 vote
- Nov 10, 2021CAS Apereo 6.1.x importing PasswordEncoderUtils0 votes · 1 answer
- Aug 2, 2021How to SSO to a directory server from a python application0 votes
- Nov 7, 2016using CAS with with custom login page0 votes
On GitHub · 9
- Sep 26, 2020Add support for login via cas - github.com/apereo/cas — strapi/strapi8 reactions · 21 comments
- Mar 19, 2025ErrorProne 2.37: StringConcatToTextBlock causes java.util.NoSuchElementException — google/error-prone3 reactions · 3 comments
- Mar 26, 2020Renovate crash: JavaScript heap out of memory (many Gradle dependencies) — renovatebot/renovate1 reaction · 8 comments
- Aug 10, 2026Add Apereo CAS project to regression testing project lists — checkstyle/test-configssays it tested it0 reactions · 1 comment
- Jul 17, 2026[Argus] CVE-2026-59099: Apereo CAS 7.3.0 < 8.0.0-RC6 - AES-GCM 논스(Nonce) 재사용으로 인한 정보 노출 — LEEKIYOON-SEC/Argus-DEV0 reactions
4 more on GitHub
- Dec 5, 2024Extract Attr within moved file — pouryafard75/RM-ASTDiff0 reactions · 14 comments
- Jan 18, 2023Authentication/Authorization: We need a API-friendly strategy — wolpert/svarm0 reactions · 1 comment
- Apr 19, 2020COMPARAISON KEYCLOAK / CAS — pegasus-io/belenios-containers0 reactions
- Mar 20, 2018apereo/cas OAuth endpoints need @Controller annotations — easy-software-ufal/annotations_repos0 reactions
On Hacker News · 3
- Feb 20, 2017Enterprise Single Sign on for all3 points
- Aug 8, 2023The Central Authentication Service Project2 points
- Oct 16, 2016Apereo CAS: Single Sign-On for the Web1 point
On the web · 1
- Apr 11, 2025apereo/cas - Where software is built — google.com
In this repository30 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .github/copilot-instructions.mdCopilot instructions
- cas-actuatorsSkill
- cas-attribute-consentSkill
- cas-build-ciSkill
- cas-docs-siteSkill
- cas-google-authenticatorSkill
- cas-groovy-scriptingSkill
- cas-handoffSkill
- cas-import-prSkill
- cas-interrupt-notificationsSkill
- cas-ldapSkill
- cas-mcp-serverSkill
- cas-oauth-oidc-authenticationSkill
- cas-oauth-oidcSkill
- cas-oid4vcSkill
- cas-passwordless-webauthnSkill
- cas-protocolSkill
- cas-puppeteer-scenariosSkill
- cas-samlSkill
- cas-sandbox-verificationSkill
- cas-service-registriesSkill
- cas-session-storesSkill
- cas-startup-performanceSkill
- cas-storage-backendsSkill
- cas-testingSkill
- cas-ticket-registriesSkill
- cas-uiSkill
- cas-web-securitySkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

