mirror of https://github.com/apache/druid.git
Add method to authorize native query using authentication result (#14376)
This commit is contained in:
parent
b5f45832b1
commit
8b212e73d7
|
@ -220,6 +220,18 @@ public class QueryLifecycle
|
|||
* @return authorization result
|
||||
*/
|
||||
public Access authorize(HttpServletRequest req)
|
||||
{
|
||||
return authorize(AuthorizationUtils.authenticationResultFromRequest(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* Authorize the query using the authentication result.
|
||||
* Will return an Access object denoting whether the query is authorized or not.
|
||||
*
|
||||
* @param authenticationResult authentication result indicating identity of the requester
|
||||
* @return authorization result of requester
|
||||
*/
|
||||
public Access authorize(AuthenticationResult authenticationResult)
|
||||
{
|
||||
transition(State.INITIALIZED, State.AUTHORIZING);
|
||||
final Iterable<ResourceAction> resourcesToAuthorize = Iterables.concat(
|
||||
|
@ -233,9 +245,9 @@ public class QueryLifecycle
|
|||
)
|
||||
);
|
||||
return doAuthorize(
|
||||
AuthorizationUtils.authenticationResultFromRequest(req),
|
||||
authenticationResult,
|
||||
AuthorizationUtils.authorizeAllResourceActions(
|
||||
req,
|
||||
authenticationResult,
|
||||
resourcesToAuthorize,
|
||||
authorizerMapper
|
||||
)
|
||||
|
|
|
@ -188,15 +188,15 @@ public class QueryLifecycleTest
|
|||
EasyMock.expect(authenticationResult.getIdentity()).andReturn(IDENTITY).anyTimes();
|
||||
EasyMock.expect(authenticationResult.getAuthorizerName()).andReturn(AUTHORIZER).anyTimes();
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource(DATASOURCE, ResourceType.DATASOURCE), Action.READ))
|
||||
.andReturn(Access.OK);
|
||||
.andReturn(Access.OK).times(2);
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource("foo", ResourceType.QUERY_CONTEXT), Action.WRITE))
|
||||
.andReturn(Access.OK);
|
||||
.andReturn(Access.OK).times(2);
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource("baz", ResourceType.QUERY_CONTEXT), Action.WRITE))
|
||||
.andReturn(Access.OK);
|
||||
.andReturn(Access.OK).times(2);
|
||||
|
||||
EasyMock.expect(toolChestWarehouse.getToolChest(EasyMock.anyObject()))
|
||||
.andReturn(toolChest)
|
||||
.once();
|
||||
.times(2);
|
||||
|
||||
replayAll();
|
||||
|
||||
|
@ -223,6 +223,10 @@ public class QueryLifecycleTest
|
|||
);
|
||||
|
||||
Assert.assertTrue(lifecycle.authorize(mockRequest()).isAllowed());
|
||||
|
||||
lifecycle = createLifecycle(authConfig);
|
||||
lifecycle.initialize(query);
|
||||
Assert.assertTrue(lifecycle.authorize(authenticationResult).isAllowed());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -232,13 +236,15 @@ public class QueryLifecycleTest
|
|||
EasyMock.expect(authenticationResult.getIdentity()).andReturn(IDENTITY).anyTimes();
|
||||
EasyMock.expect(authenticationResult.getAuthorizerName()).andReturn(AUTHORIZER).anyTimes();
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource(DATASOURCE, ResourceType.DATASOURCE), Action.READ))
|
||||
.andReturn(Access.OK);
|
||||
.andReturn(Access.OK)
|
||||
.times(2);
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource("foo", ResourceType.QUERY_CONTEXT), Action.WRITE))
|
||||
.andReturn(Access.DENIED);
|
||||
.andReturn(Access.DENIED)
|
||||
.times(2);
|
||||
|
||||
EasyMock.expect(toolChestWarehouse.getToolChest(EasyMock.anyObject()))
|
||||
.andReturn(toolChest)
|
||||
.once();
|
||||
.times(2);
|
||||
|
||||
replayAll();
|
||||
|
||||
|
@ -255,6 +261,10 @@ public class QueryLifecycleTest
|
|||
QueryLifecycle lifecycle = createLifecycle(authConfig);
|
||||
lifecycle.initialize(query);
|
||||
Assert.assertFalse(lifecycle.authorize(mockRequest()).isAllowed());
|
||||
|
||||
lifecycle = createLifecycle(authConfig);
|
||||
lifecycle.initialize(query);
|
||||
Assert.assertFalse(lifecycle.authorize(authenticationResult).isAllowed());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -264,11 +274,12 @@ public class QueryLifecycleTest
|
|||
EasyMock.expect(authenticationResult.getIdentity()).andReturn(IDENTITY).anyTimes();
|
||||
EasyMock.expect(authenticationResult.getAuthorizerName()).andReturn(AUTHORIZER).anyTimes();
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource(DATASOURCE, ResourceType.DATASOURCE), Action.READ))
|
||||
.andReturn(Access.OK);
|
||||
.andReturn(Access.OK)
|
||||
.times(2);
|
||||
|
||||
EasyMock.expect(toolChestWarehouse.getToolChest(EasyMock.anyObject()))
|
||||
.andReturn(toolChest)
|
||||
.once();
|
||||
.times(2);
|
||||
|
||||
replayAll();
|
||||
|
||||
|
@ -296,6 +307,10 @@ public class QueryLifecycleTest
|
|||
);
|
||||
|
||||
Assert.assertTrue(lifecycle.authorize(mockRequest()).isAllowed());
|
||||
|
||||
lifecycle = createLifecycle(authConfig);
|
||||
lifecycle.initialize(query);
|
||||
Assert.assertTrue(lifecycle.authorize(authenticationResult).isAllowed());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -305,11 +320,12 @@ public class QueryLifecycleTest
|
|||
EasyMock.expect(authenticationResult.getIdentity()).andReturn(IDENTITY).anyTimes();
|
||||
EasyMock.expect(authenticationResult.getAuthorizerName()).andReturn(AUTHORIZER).anyTimes();
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource(DATASOURCE, ResourceType.DATASOURCE), Action.READ))
|
||||
.andReturn(Access.OK);
|
||||
.andReturn(Access.OK)
|
||||
.times(2);
|
||||
|
||||
EasyMock.expect(toolChestWarehouse.getToolChest(EasyMock.anyObject()))
|
||||
.andReturn(toolChest)
|
||||
.once();
|
||||
.times(2);
|
||||
|
||||
replayAll();
|
||||
|
||||
|
@ -338,6 +354,10 @@ public class QueryLifecycleTest
|
|||
);
|
||||
|
||||
Assert.assertTrue(lifecycle.authorize(mockRequest()).isAllowed());
|
||||
|
||||
lifecycle = createLifecycle(authConfig);
|
||||
lifecycle.initialize(query);
|
||||
Assert.assertTrue(lifecycle.authorize(authenticationResult).isAllowed());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -347,13 +367,15 @@ public class QueryLifecycleTest
|
|||
EasyMock.expect(authenticationResult.getIdentity()).andReturn(IDENTITY).anyTimes();
|
||||
EasyMock.expect(authenticationResult.getAuthorizerName()).andReturn(AUTHORIZER).anyTimes();
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource(DATASOURCE, ResourceType.DATASOURCE), Action.READ))
|
||||
.andReturn(Access.OK);
|
||||
.andReturn(Access.OK)
|
||||
.times(2);
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource("foo", ResourceType.QUERY_CONTEXT), Action.WRITE))
|
||||
.andReturn(Access.DENIED);
|
||||
.andReturn(Access.DENIED)
|
||||
.times(2);
|
||||
|
||||
EasyMock.expect(toolChestWarehouse.getToolChest(EasyMock.anyObject()))
|
||||
.andReturn(toolChest)
|
||||
.once();
|
||||
.times(2);
|
||||
|
||||
replayAll();
|
||||
|
||||
|
@ -373,6 +395,10 @@ public class QueryLifecycleTest
|
|||
QueryLifecycle lifecycle = createLifecycle(authConfig);
|
||||
lifecycle.initialize(query);
|
||||
Assert.assertFalse(lifecycle.authorize(mockRequest()).isAllowed());
|
||||
|
||||
lifecycle = createLifecycle(authConfig);
|
||||
lifecycle.initialize(query);
|
||||
Assert.assertFalse(lifecycle.authorize(authenticationResult).isAllowed());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -382,14 +408,18 @@ public class QueryLifecycleTest
|
|||
EasyMock.expect(authenticationResult.getIdentity()).andReturn(IDENTITY).anyTimes();
|
||||
EasyMock.expect(authenticationResult.getAuthorizerName()).andReturn(AUTHORIZER).anyTimes();
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource("fake", ResourceType.DATASOURCE), Action.READ))
|
||||
.andReturn(Access.OK);
|
||||
.andReturn(Access.OK)
|
||||
.times(2);
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource("foo", ResourceType.QUERY_CONTEXT), Action.WRITE))
|
||||
.andReturn(Access.OK);
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource("baz", ResourceType.QUERY_CONTEXT), Action.WRITE)).andReturn(Access.OK);
|
||||
.andReturn(Access.OK)
|
||||
.times(2);
|
||||
EasyMock.expect(authorizer.authorize(authenticationResult, new Resource("baz", ResourceType.QUERY_CONTEXT), Action.WRITE))
|
||||
.andReturn(Access.OK)
|
||||
.times(2);
|
||||
|
||||
EasyMock.expect(toolChestWarehouse.getToolChest(EasyMock.anyObject()))
|
||||
.andReturn(toolChest)
|
||||
.once();
|
||||
.times(2);
|
||||
|
||||
replayAll();
|
||||
|
||||
|
@ -408,6 +438,10 @@ public class QueryLifecycleTest
|
|||
Assert.assertTrue(revisedContext.containsKey("queryId"));
|
||||
|
||||
Assert.assertTrue(lifecycle.authorize(mockRequest()).isAllowed());
|
||||
|
||||
lifecycle = createLifecycle(authConfig);
|
||||
lifecycle.initialize(query);
|
||||
Assert.assertTrue(lifecycle.authorize(mockRequest()).isAllowed());
|
||||
}
|
||||
|
||||
private HttpServletRequest mockRequest()
|
||||
|
|
Loading…
Reference in New Issue