apereo/cas · warning
Ticket [ ] is not registered in the catalog and is…
Error message
Ticket [{}] is not registered in the catalog and is unrecognized What it means
This is a WARN log emitted by IgniteTicketRegistry.getTicket when the requested ticket id has no entry in the CAS ticket catalog. The registry resolves tickets by looking up the ticket's metadata (including the Ignite storage/table name) from the TicketCatalog; if the catalog does not know the id prefix, it cannot determine which Ignite table to query and returns null instead of throwing. It indicates the ticket id is malformed or belongs to a ticket type that was never registered with the catalog.
Solutions
- Verify the ticket id string is a genuine CAS ticket id with a known prefix and is not truncated or corrupted before calling getTicket
- Ensure every custom ticket definition is registered with the TicketCatalog (cas.ticket.catalog entries) so its prefix maps to metadata and the correct Ignite storage name
- Check for CAS version/config changes that renamed ticket prefixes; migrate or invalidate old ids
- Handle the null return gracefully - treat it as TicketException/invalid-ticket flow rather than expecting an exception
Example fix
// before
val ticket = ticketRegistry.getTicket(requestedId, TicketGrantingTicket.class);
ticket.getAuthentication();
// after
val ticket = ticketRegistry.getTicket(requestedId, TicketGrantingTicket.class);
if (ticket == null) {
throw new InvalidTicketException(new BadRequ...
Defensive patterns
Strategy: validation
Validate before calling
if (ticketId == null || ticketId.isBlank() || !ticketId.matches("(TGT|ST|PT|PGT|RT|OC|IMP)-.*")) { throw new IllegalArgumentException("Unknown ticket id format: " + ticketId); } Type guard
function isValidTicketId(id) { return typeof id === 'string' && /^(TGT|ST|PT|PGT|RT)-/.test(id); } Try / catch
try { val ticket = registry.getTicket(id, TicketGrantingTicket.class); if (ticket == null) { /* treat as invalid ticket */ } } catch (TicketException e) { /* handle invalid/expired */ } Prevention
- Validate ticket id shape/prefix before calling getTicket
- Register all custom ticket definitions in the ticket catalog
- Never pass raw user input directly to getTicket without prior flow validation
- Treat null return as invalid-ticket, not a bug
When it happens
Trigger: Calling ticketRegistry.getTicket(ticketId) with an id whose prefix (e.g. TGT-, ST-, PGT-) does not match any TicketCatalog registration; passing an arbitrary/garbage string (e.g. from a forged or legacy callback parameter) to getTicket; a custom ticket type added to Ignite but not registered in the ticket catalog; ticket-id prefix renaming after a version upgrade or config change so old ids no longer resolve to metadata.
Common situations: Validation of a ticket id taken from an untrusted request parameter; cleanup jobs iterating over stale external references to deleted ticket types; clusters upgraded where the catalog configuration lost a ticket definition so previously valid ids now return null; tests passing literal placeholder ids.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- No ticket definition could be found in the catalog to match
- Ticket [ ] is not registered in the catalog and is…
- No authentication found for ticket
- Invalid token:
- Invalid token:
AI-assisted analysis of apereo/cas@e7288fc434 (2026-09-08).
Data as JSON: /api/errors/df74960aa29bf446.
Report an issue: GitHub.
Appendix: source
Thrown at support/cas-server-support-ignite-ticket-registry/src/main/java/org/apereo/cas/ticket/registry/IgniteTicketRegistry.java:122
if (metadata != null) {
val sql = "DELETE FROM %s where id=?".formatted(metadata.getProperties().getStorageName());
try (val rs = ignite.sql().execute(null, sql, encTicketId)) {
return rs.affectedRows();
}
}
return 0;
}
@Override
public @Nullable Ticket getTicket(final String ticketIdToGet, final Predicate<Ticket> predicate) {
val ticketId = digestIdentifier(ticketIdToGet);
if (StringUtils.isBlank(ticketId)) {
return null;
}
LOGGER.debug("Encoded ticket id is [{}]", ticketId);
val metadata = ticketCatalog.find(ticketIdToGet);
if (metadata == null) {
LOGGER.warn("Ticket [{}] is not registered in the catalog and is unrecognized", ticketIdToGet);
return null;
}
val table = ignite.tables().table(metadata.getProperties().getStorageName());
val kvView = table.keyValueView();
val keyTuple = Tuple.create().set("id", ticketId);
val valueTuple = kvView.get(null, keyTuple);
if (valueTuple == null) {
LOGGER.debug("No ticket by id [{}] is found in the ignite ticket registry", ticketIdToGet);
return null;
}
val ticketBytes = valueTuple.bytesValue("ticket");
val result = decodeAndDeserialize(ticketBytes);
return predicate.test(result) ? result : null;
}
@Override
public Collection<? extends Ticket> getTickets() {
try (val stream = stream()) {View on GitHub (pinned to e7288fc434)