apache/pulsar · error · RestException
Unauthorized to validateTopicOperation for operation [%s] on
Error message
Unauthorized to validateTopicOperation for operation [%s] on topic [%s]
What it means
Authorization guard for topic operations (produce/consume/etc.): the client's role lacks the specific topic operation permission; returned as an authorization failure from validateTopicOperationAsync.
Source
Thrown at pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PulsarWebResource.java:1273
return validateTopicOperationAsync(topicName, operation, null);
}
public CompletableFuture<Void> validateTopicOperationAsync(TopicName topicName,
TopicOperation operation, String subscription) {
if (pulsar().getConfiguration().isAuthenticationEnabled()
&& pulsar().getBrokerService().isAuthorizationEnabled()) {
if (!isClientAuthenticated(clientAppId())) {
return FutureUtil.failedFuture(
new RestException(Status.UNAUTHORIZED, "Need to authenticate to perform the request"));
}
AuthenticationDataSource authData = clientAuthData();
authData.setSubscription(subscription);
return pulsar().getBrokerService().getAuthorizationService()
.allowTopicOperationAsync(topicName, operation, originalPrincipal(), clientAppId(), authData)
.thenAccept(isAuthorized -> {
if (!isAuthorized) {
throw new RestException(Status.UNAUTHORIZED, String.format(
"Unauthorized to validateTopicOperation for operation [%s] on topic [%s]",
operation.toString(), topicName));
}
});
} else {
return CompletableFuture.completedFuture(null);
}
}
public <T> T sync(Supplier<CompletableFuture<T>> supplier) {
try {
return supplier.get().get(config().getMetadataStoreOperationTimeoutSeconds(), SECONDS);
} catch (ExecutionException | TimeoutException ex) {
Throwable realCause = FutureUtil.unwrapCompletionException(ex);
if (realCause instanceof WebApplicationException) {
throw (WebApplicationException) realCause;
} else {
throw new RestException(realCause);View on GitHub (pinned to 820761864e)
Solutions
- grant permissions on the topic for the role and operation
- Check authentication is enabled correctly so the role is resolved
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at pulsar-broker/src/main/java/org/apache/pulsar/broker/web/PulsarWebResource.java:1273 when the library encounters an invalid state.
Common situations: See trigger scenarios.
Understand the failure class
- Authentication and authorization failures — expired tokens, bad credentials, and missing scopes.
AI-assisted analysis of apache/pulsar@820761864e (2026-09-06).
Data as JSON: /api/errors/98fddb5cd27d37ac.
Report an issue: GitHub.