danhuawang opened a new issue, #10150:
URL: https://github.com/apache/gravitino/issues/10150

   ### Version
   
   main branch
   
   ### Describe what's wrong
   
   Schema Owner with the USE_CATALOG privilege failed to replace View 
(ForbiddenException).
   
   After I restart the server,  then I replace view sucessully.
   
   ### Error message and/or stacktrace
   
   ```
   {
       "error": {
           "message": "User 'Lisa' is not authorized to perform operation 
'replaceView' on metadata 'irc_test.irc_catalog.s1.test_view_1' with expression 
'ANY(OWNER, METALAKE, CATALOG) || SCHEMA_OWNER_WITH_USE_CATALOG || 
ANY_USE_CATALOG && ANY_USE_SCHEMA && VIEW::OWNER'",
           "type": "ForbiddenException",
           "code": 403,
           "stack": [
               "org.apache.iceberg.exceptions.ForbiddenException: User 'Lisa' 
is not authorized to perform operation 'replaceView' on metadata 
'irc_test.irc_catalog.s1.test_view_1' with expression 'ANY(OWNER, METALAKE, 
CATALOG) || SCHEMA_OWNER_WITH_USE_CATALOG || ANY_USE_CATALOG && ANY_USE_SCHEMA 
&& VIEW::OWNER'",
               "\tat 
org.apache.gravitino.server.web.filter.BaseMetadataAuthorizationMethodInterceptor.invoke(BaseMetadataAuthorizationMethodInterceptor.java:184)",
               "\tat 
org.jvnet.hk2.internal.MethodInterceptorHandler.invoke(MethodInterceptorHandler.java:97)",
               "\tat 
org.apache.gravitino.iceberg.service.rest.IcebergViewOperations_$$_jvstaca_a.replaceView(IcebergViewOperations_$$_jvstaca_a.java)",
               "\tat 
jdk.internal.reflect.GeneratedMethodAccessor230.invoke(Unknown Source)",
               "\tat 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
               "\tat 
java.base/java.lang.reflect.Method.invoke(Method.java:568)",
               "\tat 
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)",
               "\tat 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:146)",
               "\tat 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:189)",
               "\tat 
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)",
               "\tat 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:93)",
               "\tat 
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)",
               "\tat 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)",
               "\tat 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)",
               "\tat 
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:256)",
               "\tat 
org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)",
               "\tat 
org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)",
               "\tat 
org.glassfish.jersey.internal.Errors.process(Errors.java:292)",
               "\tat 
org.glassfish.jersey.internal.Errors.process(Errors.java:274)",
               "\tat 
org.glassfish.jersey.internal.Errors.process(Errors.java:244)",
               "\tat 
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)",
               "\tat 
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:235)",
               "\tat 
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)",
               "\tat 
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)",
               "\tat 
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)",
               "\tat 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:358)",
               "\tat 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:311)",
               "\tat 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)",
               "\tat 
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)",
               "\tat 
org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1656)",
               "\tat 
org.apache.gravitino.server.authentication.AuthenticationFilter.lambda$doFilter$0(AuthenticationFilter.java:89)",
               "\tat 
java.base/java.security.AccessController.doPrivileged(AccessController.java:712)",
               "\tat 
java.base/javax.security.auth.Subject.doAs(Subject.java:439)",
               "\tat 
org.apache.gravitino.utils.PrincipalUtils.doAs(PrincipalUtils.java:44)",
               "\tat 
org.apache.gravitino.server.authentication.AuthenticationFilter.doFilter(AuthenticationFilter.java:86)",
               "\tat 
org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)",
               "\tat 
org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626)",
               "\tat 
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:552)",
               "\tat 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)",
               "\tat 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)",
               "\tat 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)",
               "\tat 
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505)",
               "\tat 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)",
               "\tat 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)",
               "\tat 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)",
               "\tat 
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)",
               "\tat 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)",
               "\tat org.eclipse.jetty.server.Server.handle(Server.java:516)",
               "\tat 
org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)",
               "\tat 
org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)",
               "\tat 
org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)",
               "\tat 
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)",
               "\tat 
org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)",
               "\tat 
org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)",
               "\tat 
org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)",
               "\tat 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)",
               "\tat 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)",
               "\tat 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)",
               "\tat 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)",
               "\tat 
org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)",
               "\tat 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)",
               "\tat 
org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)",
               "\tat java.base/java.lang.Thread.run(Thread.java:840)"
           ]
       }
   }
   ```
   
   ### How to reproduce
   
   1. Create a view under schema `irc_catalog.s1`
   POST http://127.0.0.1:19001/iceberg/v1/irc_catalog/namespaces/s1/views
   ```
   {
       "name": "test_view_1",
       "schema": {
           "type": "struct",
           "schema-id": 0,
           "fields": [
               {
                   "id": 1,
                   "name": "id",
                   "required": true,
                   "type": "int"
               },
               {
                   "id": 2,
                   "name": "data",
                   "required": false,
                   "type": "string"
               }
           ]
       },
       "view-version": {
           "version-id": 1,
           "timestamp-ms": 1772530509921,
           "schema-id": 0,
           "summary": {
               "operation": "create"
           },
           "representations": [
               {
                   "type": "sql",
                   "sql": "SELECT id, data FROM s1.source_table",
                   "dialect": "spark"
               }
           ],
           "default-namespace": [
               "s1"
           ]
       },
       "properties": {
           "comment": "Test view"
       }
   }
   
   ```
   2. Set the schema `irc_catalog.s1` owner to user `Lisa`<img width="530" 
height="535" alt="Image" 
src="https://github.com/user-attachments/assets/d6fcd277-c913-472f-8382-65d7e6dac35b";
 />
   
   3. Create a role `ircViewRole5b` with use_catalog privilege
   ```
   {
       "code": 0,
       "role": {
           "name": "ircViewRole5b",
           "audit": {
               "creator": "anonymous",
               "createTime": "2026-03-03T09:35:30.764831Z",
               "lastModifier": "anonymous",
               "lastModifiedTime": "2026-03-03T09:35:30.787942Z"
           },
           "properties": {
               "k1": "v1"
           },
           "securableObjects": [
               {
                   "type": "catalog",
                   "privileges": [
                       {
                           "name": "use_catalog",
                           "condition": "allow"
                       }
                   ],
                   "fullName": "irc_catalog"
               },
               {
                   "type": "metalake",
                   "privileges": [
                       {
                           "name": "use_schema",
                           "condition": "allow"
                       },
                       {
                           "name": "use_catalog",
                           "condition": "allow"
                       }
                   ],
                   "fullName": "irc_test"
               }
           ]
       }
   }
   ```
   4. Grant the role to the user
   5. Use the user `Lisa` to replace view
   
   POST {{irchost}}/iceberg/v1/:catalog/namespaces/:schema/views/:view
   ```
   {
       "requirements": [
           
       ],
       "updates": [
           {
               "action": "add-view-version",
               "view-version": {
                   "version-id": 2,
                   "timestamp-ms": 1772530530809,
                   "schema-id": 0,
                   "summary": {
                       "operation": "replace"
                   },
                   "representations": [
                       {
                           "type": "sql",
                           "sql": "SELECT id, data FROM s1.updated_table",
                           "dialect": "spark"
                       }
                   ],
                   "default-namespace": [
                       "s1"
                   ]
               }
           },
           {
               "action": "set-current-view-version",
               "view-version-id": 2
           }
       ]
   }
   ```
   
   ### Additional context
   
   _No response_


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to