Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge dropwizard-java8 addon into mainline #1365

Merged
merged 1 commit into from Dec 5, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -1,8 +1,7 @@
package io.dropwizard.auth;

import com.google.common.base.Optional;

import java.security.Principal;
import java.util.Optional;

/**
* An interface for classes which authenticate user-provided credentials and return principal
Expand All @@ -14,10 +13,10 @@
public interface Authenticator<C, P extends Principal> {
/**
* Given a set of user-provided credentials, return an optional principal.
* <p/>
* If the credentials are valid and map to a principal, returns an {@code Optional.of(p)}.
* <p/>
* If the credentials are invalid, returns an {@code Optional.absent()}.
*
* If the credentials are valid and map to a principal, returns an {@link Optional#of(Object)}.
*
* If the credentials are invalid, returns an {@link Optional#empty()}.
*
* @param credentials a set of user-provided credentials
* @return either an authenticated principal or an absent optional
Expand Down
Expand Up @@ -3,14 +3,15 @@
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheBuilderSpec;
import com.google.common.cache.CacheStats;
import com.google.common.collect.Sets;
import java.security.Principal;
import java.util.Optional;

import static com.codahale.metrics.MetricRegistry.name;

/**
Expand Down
@@ -1,6 +1,5 @@
package io.dropwizard.auth.basic;

import com.google.common.base.Optional;
import com.google.common.io.BaseEncoding;
import io.dropwizard.auth.AuthenticationException;
import io.dropwizard.auth.AuthFilter;
Expand All @@ -17,6 +16,7 @@
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.Principal;
import java.util.Optional;

@Priority(Priorities.AUTHENTICATION)
public class BasicCredentialAuthFilter<P extends Principal> extends AuthFilter<BasicCredentials, P> {
Expand Down
@@ -1,6 +1,5 @@
package io.dropwizard.auth.oauth;

import com.google.common.base.Optional;
import io.dropwizard.auth.AuthenticationException;
import io.dropwizard.auth.AuthFilter;
import io.dropwizard.auth.Authenticator;
Expand All @@ -16,6 +15,7 @@
import javax.ws.rs.core.SecurityContext;
import java.io.IOException;
import java.security.Principal;
import java.util.Optional;

@Priority(Priorities.AUTHENTICATION)
public class OAuthCredentialAuthFilter<P extends Principal> extends AuthFilter<String, P> {
Expand Down
@@ -1,15 +1,14 @@
package io.dropwizard.auth;

import com.codahale.metrics.MetricRegistry;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.cache.CacheBuilderSpec;
import com.google.common.collect.ImmutableSet;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;

import java.security.Principal;
import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.anyString;
Expand All @@ -23,7 +22,7 @@ public class CachingAuthenticatorTest {
@SuppressWarnings("unchecked")
private final Authenticator<String, Principal> underlying = mock(Authenticator.class);
private final CachingAuthenticator<String, Principal> cached =
new CachingAuthenticator<>(new MetricRegistry(), underlying, CacheBuilderSpec.parse("maximumSize=1"));
new CachingAuthenticator<>(new MetricRegistry(), underlying, CacheBuilderSpec.parse("maximumSize=1"));

@Before
public void setUp() throws Exception {
Expand Down Expand Up @@ -70,15 +69,8 @@ public void invalidatesSetsOfCredentials() throws Exception {

@Test
public void invalidatesCredentialsMatchingGivenPredicate() throws Exception {
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean apply(String c) {
return c.equals("credentials");
}
};

cached.authenticate("credentials");
cached.invalidateAll(predicate);
cached.invalidateAll("credentials"::equals);
cached.authenticate("credentials");

verify(underlying, times(2)).authenticate("credentials");
Expand Down Expand Up @@ -108,8 +100,8 @@ public void calculatesCacheStats() throws Exception {

@Test
public void shouldNotCacheAbsentPrincipals() throws Exception {
when(underlying.authenticate(anyString())).thenReturn(Optional.<Principal>absent());
assertThat(cached.authenticate("credentials")).isEqualTo(Optional.absent());
when(underlying.authenticate(anyString())).thenReturn(Optional.<Principal>empty());
assertThat(cached.authenticate("credentials")).isEqualTo(Optional.empty());
verify(underlying).authenticate("credentials");
assertThat(cached.size()).isEqualTo(0);
}
Expand Down
Expand Up @@ -21,6 +21,7 @@
public class ChainedAuthProviderTest extends AuthBaseTest<ChainedAuthProviderTest.ChainedAuthTestResourceConfig>{
private static final String BEARER_USER = "A12B3C4D";
public static class ChainedAuthTestResourceConfig extends DropwizardResourceConfig {
@SuppressWarnings("unchecked")
public ChainedAuthTestResourceConfig() {
super(true, new MetricRegistry());

Expand Down
@@ -1,69 +1,58 @@
package io.dropwizard.auth.util;

import com.google.common.base.Optional;
import io.dropwizard.auth.*;
import io.dropwizard.auth.AuthenticationException;
import io.dropwizard.auth.Authenticator;
import io.dropwizard.auth.Authorizer;
import io.dropwizard.auth.PrincipalImpl;
import io.dropwizard.auth.basic.BasicCredentials;

import java.security.Principal;
import java.util.List;
import java.util.Optional;

public class AuthUtil {

public static Authenticator<BasicCredentials, Principal> getBasicAuthenticator(final List<String> validUsers) {
return new Authenticator<BasicCredentials, Principal>() {
@Override
public Optional<Principal> authenticate(BasicCredentials credentials) throws AuthenticationException {
if (validUsers.contains(credentials.getUsername()) && "secret".equals(credentials.getPassword())) {
return Optional.<Principal>of(new PrincipalImpl(credentials.getUsername()));
}
if ("bad-guy".equals(credentials.getUsername())) {
throw new AuthenticationException("CRAP");
}
return Optional.absent();
return credentials -> {
if (validUsers.contains(credentials.getUsername()) && "secret".equals(credentials.getPassword())) {
return Optional.<Principal>of(new PrincipalImpl(credentials.getUsername()));
}
if ("bad-guy".equals(credentials.getUsername())) {
throw new AuthenticationException("CRAP");
}
return Optional.empty();
};
}

public static Authenticator<String, Principal> getSingleUserOAuthAuthenticator(final String presented,
final String returned) {
return new Authenticator<String, Principal>() {
@Override
public Optional<Principal> authenticate(String user) throws AuthenticationException {
if (presented.equals(user)) {
return Optional.<Principal>of(new PrincipalImpl(returned));
}
if ("bad-guy".equals(user)) {
throw new AuthenticationException("CRAP");
}
return Optional.absent();
return user -> {
if (presented.equals(user)) {
return Optional.<Principal>of(new PrincipalImpl(returned));
}
if ("bad-guy".equals(user)) {
throw new AuthenticationException("CRAP");
}
return Optional.empty();
};
}

public static Authenticator<String, Principal> getMultiplyUsersOAuthAuthenticator(final List<String> validUsers) {
return new Authenticator<String, Principal>() {
@Override
public Optional<Principal> authenticate(String credentials) throws AuthenticationException {
if (validUsers.contains(credentials)) {
return Optional.<Principal>of(new PrincipalImpl(credentials));
}
if (credentials.equals("bad-guy")) {
throw new AuthenticationException("CRAP");
}
return Optional.absent();
return credentials -> {
if (validUsers.contains(credentials)) {
return Optional.<Principal>of(new PrincipalImpl(credentials));
}
if ("bad-guy".equals(credentials)) {
throw new AuthenticationException("CRAP");
}
return Optional.empty();
};
}

public static Authorizer<Principal> getTestAuthorizer(final String validUser,
final String validRole) {
return new Authorizer<Principal>() {
@Override
public boolean authorize(Principal principal, String role) {
return principal != null
&& validUser.equals(principal.getName())
&& validRole.equals(role);
}
};
return (principal, role) -> principal != null
&& validUser.equals(principal.getName())
&& validRole.equals(role);
}
}
10 changes: 10 additions & 0 deletions dropwizard-bom/pom.xml
Expand Up @@ -274,6 +274,16 @@
<artifactId>jackson-datatype-jdk7</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
Expand Down
Expand Up @@ -8,10 +8,10 @@
import io.dropwizard.Configuration;
import io.dropwizard.configuration.DefaultConfigurationFactoryFactory;
import io.dropwizard.configuration.FileConfigurationSourceProvider;

import io.dropwizard.jackson.Jackson;
import io.dropwizard.jersey.validation.NonEmptyStringParamUnwrapper;
import io.dropwizard.jersey.validation.ParamValidatorUnwrapper;
import io.dropwizard.validation.valuehandling.GuavaOptionalValidatedValueUnwrapper;
import io.dropwizard.validation.valuehandling.OptionalValidatedValueUnwrapper;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.internal.engine.ValidatorFactoryImpl;
Expand Down Expand Up @@ -103,7 +103,8 @@ public void defaultsToDefaultValidatorFactory() throws Exception {
// https://hibernate.atlassian.net/browse/HV-904
assertThat(validatorFactory.getValidatedValueHandlers())
.extractingResultOf("getClass")
.containsSubsequence(OptionalValidatedValueUnwrapper.class,
.containsSubsequence(GuavaOptionalValidatedValueUnwrapper.class,
OptionalValidatedValueUnwrapper.class,
NonEmptyStringParamUnwrapper.class,
ParamValidatorUnwrapper.class);
}
Expand Down
@@ -1,17 +1,18 @@
package com.example.helloworld.auth;

import com.example.helloworld.core.User;
import com.google.common.base.Optional;
import io.dropwizard.auth.AuthenticationException;
import io.dropwizard.auth.Authenticator;
import io.dropwizard.auth.basic.BasicCredentials;

import java.util.Optional;

public class ExampleAuthenticator implements Authenticator<BasicCredentials, User> {
@Override
public Optional<User> authenticate(BasicCredentials credentials) throws AuthenticationException {
if ("secret".equals(credentials.getPassword())) {
return Optional.of(new User(credentials.getUsername()));
}
return Optional.absent();
return Optional.empty();
}
}
8 changes: 8 additions & 0 deletions dropwizard-jackson/pom.xml
Expand Up @@ -52,6 +52,14 @@
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-afterburner</artifactId>
Expand Down
Expand Up @@ -4,7 +4,9 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
import com.fasterxml.jackson.datatype.jdk7.Jdk7Module;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;

/**
Expand Down Expand Up @@ -57,6 +59,8 @@ private static ObjectMapper configure(ObjectMapper mapper) {
mapper.registerModule(new AfterburnerModule());
mapper.registerModule(new FuzzyEnumModule());
mapper.registerModule(new Jdk7Module());
mapper.registerModules(new Jdk8Module());
mapper.registerModules(new JavaTimeModule());
mapper.setPropertyNamingStrategy(new AnnotationSensitivePropertyNamingStrategy());
mapper.setSubtypeResolver(new DiscoverableSubtypeResolver());

Expand Down