Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,14 @@
<artifactId>dropwizard-hibernate</artifactId>
<version>${dropwizard.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle/ojdbc8 -->
<!--DropWizard Authentication -->
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-auth</artifactId>
<version>${dropwizard.version}</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.oracle/ojdbc8 -->
<!-- <dependency>-->
<!-- <groupId>com.oracle.ojdbc</groupId>-->
<!-- <artifactId>ojdbc8</artifactId>-->
Expand Down
22 changes: 20 additions & 2 deletions src/main/java/someshbose/github/io/HelloWorldApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@
import com.google.inject.Guice;
import com.google.inject.Injector;
import io.dropwizard.Application;
import io.dropwizard.auth.AuthDynamicFeature;
import io.dropwizard.auth.AuthValueFactoryProvider;
import io.dropwizard.auth.basic.BasicCredentialAuthFilter;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import lombok.extern.slf4j.Slf4j;
import org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature;
import someshbose.github.io.app.config.HelloWorldApplicationModule;
import someshbose.github.io.app.config.HelloWorldApplicationConfiguration;
import someshbose.github.io.app.controller.HelloWorldApplicationResource;
Expand All @@ -14,7 +18,10 @@
import io.dropwizard.migrations.MigrationsBundle;
import io.dropwizard.hibernate.HibernateBundle;
import someshbose.github.io.app.controller.PersonResource;
import someshbose.github.io.model.Person;
import someshbose.github.io.domain.model.Person;
import someshbose.github.io.domain.model.User;
import someshbose.github.io.infra.auth.AppAuthorizer;
import someshbose.github.io.infra.auth.AppBasicAuthenticator;

@Slf4j
public class HelloWorldApplication extends Application<HelloWorldApplicationConfiguration> {
Expand Down Expand Up @@ -61,7 +68,7 @@ public void run(HelloWorldApplicationConfiguration configuration, Environment en
Injector injector = Guice.createInjector(new HelloWorldApplicationModule(configuration,hibernate));
registerResources(injector,environment,configuration);
registerHealthCheck(environment,configuration);

registerAuthentication(environment);
}

private void registerResources(Injector injector, Environment environment, HelloWorldApplicationConfiguration configuration){
Expand All @@ -72,5 +79,16 @@ private void registerResources(Injector injector, Environment environment, Hello
private void registerHealthCheck(Environment environment, HelloWorldApplicationConfiguration configuration){
environment.healthChecks().register("HelloWorldApplicationHealthCheck", new HelloWorldApplicationHealthCheck(configuration.getTemplate()));
}

/****** Dropwizard security - custom classes ***********/
private void registerAuthentication(Environment environment){
environment.jersey().register(new AuthDynamicFeature(new BasicCredentialAuthFilter.Builder<User>()
.setAuthenticator(new AppBasicAuthenticator())
.setAuthorizer(new AppAuthorizer())
.setRealm("BASIC-AUTH-REALM")
.buildAuthFilter()));
environment.jersey().register(RolesAllowedDynamicFeature.class);
environment.jersey().register(new AuthValueFactoryProvider.Binder<>(User.class));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

import java.util.Optional;
import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.security.RolesAllowed;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import com.codahale.metrics.annotation.Timed;
import someshbose.github.io.model.Saying;
import io.dropwizard.auth.Auth;
import someshbose.github.io.domain.model.Saying;
import someshbose.github.io.domain.model.User;

@Path("/hello-world")
@Produces(MediaType.APPLICATION_JSON)
Expand All @@ -27,8 +30,9 @@ public HelloWorldApplicationResource(String template, String defaultName) {
}

@GET
@RolesAllowed({ "ADMIN"})
@Timed
public Saying sayHello(@QueryParam("name") Optional<String> name) {
public Saying sayHello(@QueryParam("name") Optional<String> name, @Auth User user) {
final String value = String.format(template, name.orElse(defaultName));
return new Saying(counter.incrementAndGet(), value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import io.dropwizard.hibernate.UnitOfWork;
import someshbose.github.io.app.dao.PersonDao;
import someshbose.github.io.model.Person;
import someshbose.github.io.domain.dao.PersonDao;
import someshbose.github.io.domain.model.Person;

@Path("/person")
@Consumes({MediaType.APPLICATION_JSON})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package someshbose.github.io.app.dao;
package someshbose.github.io.domain.dao;

import java.util.List;
import org.hibernate.SessionFactory;
import io.dropwizard.hibernate.AbstractDAO;
import org.hibernate.query.Query;
import someshbose.github.io.model.Person;
import someshbose.github.io.domain.model.Person;

import javax.inject.Inject;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package someshbose.github.io.model;
package someshbose.github.io.domain.model;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package someshbose.github.io.model;
package someshbose.github.io.domain.model;

import com.fasterxml.jackson.annotation.JsonProperty;

Expand Down
32 changes: 32 additions & 0 deletions src/main/java/someshbose/github/io/domain/model/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package someshbose.github.io.domain.model;

import java.security.Principal;
import java.util.Set;

public class User implements Principal {
private final String name;

private final Set<String> roles;

public User(String name) {
this.name = name;
this.roles = null;
}

public User(String name, Set<String> roles) {
this.name = name;
this.roles = roles;
}

public String getName() {
return name;
}

public int getId() {
return (int) (Math.random() * 100);
}

public Set<String> getRoles() {
return roles;
}
}
12 changes: 12 additions & 0 deletions src/main/java/someshbose/github/io/infra/auth/AppAuthorizer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package someshbose.github.io.infra.auth;

import io.dropwizard.auth.Authorizer;
import someshbose.github.io.domain.model.User;

public class AppAuthorizer implements Authorizer<User>
{
@Override
public boolean authorize(User user, String role) {
return user.getRoles() != null && user.getRoles().contains(role);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package someshbose.github.io.infra.auth;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import io.dropwizard.auth.AuthenticationException;
import io.dropwizard.auth.Authenticator;
import io.dropwizard.auth.basic.BasicCredentials;
import someshbose.github.io.domain.model.User;

import java.util.Map;
import java.util.Optional;
import java.util.Set;

public class AppBasicAuthenticator implements Authenticator<BasicCredentials, User>
{
private static final Map<String, Set<String>> VALID_USERS = ImmutableMap.of(
"guest", ImmutableSet.of(),
"user", ImmutableSet.of("USER"),
"admin", ImmutableSet.of("ADMIN", "USER")
);

@Override
public Optional<User> authenticate(BasicCredentials credentials) throws AuthenticationException
{
if (VALID_USERS.containsKey(credentials.getUsername()) && "password".equals(credentials.getPassword()))
{
return Optional.of(new User(credentials.getUsername(), VALID_USERS.get(credentials.getUsername())));
}
return Optional.empty();
}
}