Thanks for starting this thread, Zixuan.

For additional context, I provided some related feedback in comments
on this PR: https://github.com/apache/pulsar/pull/18130.

> So I suggest the proxy should always forward the authentication data from
> the client.

This is already the case for both HTTP and pulsar protocols:
https://github.com/apache/pulsar/blob/82237d3684fe506bcb6426b3b23f413422e6e4fb/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/DirectProxyHandler.java#L327-L328
https://github.com/apache/pulsar/blob/82237d3684fe506bcb6426b3b23f413422e6e4fb/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyClientCnx.java#L62-L64

I investigated the code snippet referenced above (one example linked
here [0]), and I noticed that the main difference comes from this
broker setting "authenticateOriginalAuthData".

When `authenticateOriginalAuthData` is set to false,
`originalAuthDataSource` is always null in the ServerCnx. This looks
like a consequence of how the `originalAuthDataSource` is built
because the authentication provider builds the `originalAuthState`,
which then builds the `originalAuthDataSource`. See [1].

Is it sufficient to enable authenticateOriginalAuthData?

Thanks,
Michael

[0] 
https://github.com/apache/pulsar/blob/8f8637a75e05f271bdc8fa2081284d39bc5de972/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java#L407-L409
[1] 
https://github.com/apache/pulsar/blob/8f8637a75e05f271bdc8fa2081284d39bc5de972/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java#L906-L942

On Mon, Oct 31, 2022 at 5:29 AM Zixuan Liu <node...@gmail.com> wrote:
>
> Hi all,
>
> I want to discuss the authentication data issue, which affects the
> authorization operation.
>
> For the default to authorization provider, we only used the role to check
> the permission, the authentication data was ignored. When a user wants to
> customize an authorization provider, the user can care for the
> authentication data and role, sometimes the Pulsar cannot pass the correct
> authentication data to the authorization provider.
>
> So like:
> ```
> if (originalPrincipal != null) {
>     isProxyAuthorizedFuture =
> service.getAuthorizationService().allowTopicOperationAsync(
>             topicName, operation, originalPrincipal,
>             originalAuthDataSource != null ? originalAuthDataSource :
> authDataSource);
> }
> ```
>
> For the above code, when `originalAuthDataSource` is null, use the
> `authDataSource` instead. This results in a mismatch between the
> authentication data and the role.
>
> The `originalAuthDataSource` is the authentication data of the user client
> forwarded by the proxy. When the proxy doesn't forward this authentication
> data, we cannot get the correct authentication data in the authorization
> provider.
>
> So I suggest the proxy should always forward the authentication data from
> the client. Another important reason is that we usually check the
> permission of the user client, not the proxy client.
>
> Please let me know your idea.
>
> Thanks,
> Zixuan

Reply via email to