Skip to content

Commit

Permalink
Use Pastis for all user authorizations. (#1629)
Browse files Browse the repository at this point in the history
When CompositeAuthorizationFactory is used, only return Pastis authorizer for UserPrincipal.
Only create 1 BasePastisAuthorizer instance.
Change the order of authenticators to favor envoyAuthFilter.
  • Loading branch information
tylerwowen authored May 28, 2024
1 parent d463e65 commit 66edfd7
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 11 deletions.
3 changes: 3 additions & 0 deletions deploy-service/teletraanservice/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,9 @@
<excludes>
<exclude>com/pinterest/teletraan/config/CompositeAuthorizationFactory.java</exclude>
</excludes>
<testExcludes>
<testExclude>**/CompositeAuthorizationFactoryTest.java</testExclude>
</testExcludes>
</configuration>
</plugin>
</plugins>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ public ContainerRequestFilter create(TeletraanServiceContext context) throws Exc
.setAuthorizer(context.getAuthorizationFactory().create(context))
.buildAuthFilter();

return new ChainedAuthFilter(Arrays.asList(createScriptTokenAuthFilter(context),
createOauthTokenAuthFilter(context), envoyAuthFilter, createJwtTokenAuthFilter(context)));
return new ChainedAuthFilter(
Arrays.asList(
createScriptTokenAuthFilter(context),
envoyAuthFilter,
createOauthTokenAuthFilter(context),
createJwtTokenAuthFilter(context)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,17 @@
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.pinterest.teletraan.TeletraanServiceContext;
import com.pinterest.teletraan.security.ScriptTokenRoleAuthorizer;
import com.pinterest.teletraan.security.UserRoleAuthorizer;
import com.pinterest.teletraan.universal.security.BasePastisAuthorizer;
import com.pinterest.teletraan.universal.security.bean.ServicePrincipal;
import com.pinterest.teletraan.universal.security.bean.TeletraanPrincipal;
import com.pinterest.teletraan.universal.security.bean.UserPrincipal;
import io.dropwizard.auth.Authorizer;

@JsonTypeName("composite")
public class CompositeAuthorizationFactory implements AuthorizationFactory {
private static final String DEFAULT_PASTIS_SERVICE_NAME = "teletraan_dev";

@JsonProperty private String pastisServiceName = DEFAULT_PASTIS_SERVICE_NAME;
private Authorizer<TeletraanPrincipal> pastisAuthorizer;

public void setPastisServiceName(String pastisServiceName) {
this.pastisServiceName = pastisServiceName;
Expand All @@ -43,20 +42,21 @@ public String getPastisServiceName() {
@Override
public <P extends TeletraanPrincipal> Authorizer<P> create(TeletraanServiceContext context)
throws Exception {
return (Authorizer<P>)
BasePastisAuthorizer.builder()
.factory(context.getAuthZResourceExtractorFactory())
.serviceName(pastisServiceName)
.build();
if (pastisAuthorizer == null) {
pastisAuthorizer =
BasePastisAuthorizer.builder()
.factory(context.getAuthZResourceExtractorFactory())
.serviceName(pastisServiceName)
.build();
}
return (Authorizer<P>) pastisAuthorizer;
}

@Override
public <P extends TeletraanPrincipal> Authorizer<? extends TeletraanPrincipal> create(
TeletraanServiceContext context, Class<P> principalClass) throws Exception {
if (ServicePrincipal.class.equals(principalClass)) {
return new ScriptTokenRoleAuthorizer(context.getAuthZResourceExtractorFactory());
} else if (UserPrincipal.class.equals(principalClass)) {
return new UserRoleAuthorizer(context, context.getAuthZResourceExtractorFactory());
}
return create(context);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/**
* Copyright (c) 2024 Pinterest, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.pinterest.teletraan.config;

import static org.junit.Assert.assertSame;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.pinterest.teletraan.TeletraanServiceContext;
import com.pinterest.teletraan.security.TeletraanAuthZResourceExtractorFactory;
import com.pinterest.teletraan.universal.security.BasePastisAuthorizer;
import io.dropwizard.auth.Authorizer;
import org.junit.jupiter.api.Test;

class CompositeAuthorizationFactoryTest {
@Test
void testCreate() throws Exception {
TeletraanServiceContext context = new TeletraanServiceContext();
context.setAuthZResourceExtractorFactory(
new TeletraanAuthZResourceExtractorFactory(context));
CompositeAuthorizationFactory factory = new CompositeAuthorizationFactory();

Authorizer<?> authorizer = factory.create(context);
assertNotNull(authorizer);
assertTrue(authorizer instanceof BasePastisAuthorizer);

Authorizer<?> authorizer2 = factory.create(context);
assertSame(authorizer, authorizer2);
}
}

0 comments on commit 66edfd7

Please sign in to comment.