Implementing Claims-Based Identity

1. Understanding Claims Concepts

TermDetail
ClaimName/value assertion about subject
IssuerAuthority making the claim
SubjectEntity claim describes
ContainerJWT, SAML Assertion, X.509 cert

2. Creating Claims

Example: Claims in token

{
  "sub": "user_42",
  "email": "alice@example.com",
  "email_verified": true,
  "https://app.example/tenant": "acme",
  "https://app.example/roles": ["admin", "billing"],
  "iss": "https://auth.example",
  "exp": 1715000000
}

3. Using Standard Claim Types

SpecExamples
JWT (RFC 7519)iss, sub, aud, exp, nbf, iat, jti
OIDC standardname, email, picture, address, phone
SAMLNameID + attribute statements
SCIM (RFC 7643)userName, emails, groups, active

4. Implementing Custom Claims

PracticeDetail
NamespaceURI prefix: https://app/tenant
SizeKeep tokens < 1KB
PIIAvoid sensitive data — JWT is signed not encrypted
StabilityDon't break consumers; version namespace

5. Validating Claims

ClaimValidation
issMatches expected issuer
audIncludes this service
exp / nbfNow within window (±60s skew)
scopeRequired scope present
azpAuthorized client

6. Transforming Claims

TransformationExample
Renameupnemail
FilterDrop sensitive claims for downstream services
EnrichAdd tenant, plan from DB lookup
Map valuesIdP groups → app roles

7. Using Claims for Authorization

Example: Claim-based check

@PreAuthorize("@auth.hasClaim('plan', 'premium')")
public Report generateAdvancedReport() { ... }

8. Implementing Claims-Based Policies

Policy TypeDetail
Required claimMust have plan=premium
Claim value rangeage > 18
Combinedrole=admin AND mfa_level=strong
Spring.requiresClaim("plan", "premium")

9. Handling Claims in JWT

ConsiderationDetail
SizeMinimize — affects every request
FreshnessClaims stale until token refresh
VisibilityBase64 — anyone with token can read
ArraysRoles/groups as JSON arrays

10. Implementing Claims Enrichment

Hook PointDetail
Token issuanceAdd custom claims from DB/external (Auth0 Actions, Okta hooks)
Token exchangeRFC 8693 transform claims downstream
API gatewayAdd claims at edge based on user lookup
CaveatHook latency adds to login time