Skip to content

Commit

Permalink
Add Micronaut sample
Browse files Browse the repository at this point in the history
  • Loading branch information
vpavic committed Nov 25, 2019
1 parent e77887a commit bc8977b
Show file tree
Hide file tree
Showing 8 changed files with 155 additions and 3 deletions.
7 changes: 4 additions & 3 deletions .gitignore
@@ -1,3 +1,4 @@
.gradle
.idea
build
.gradle/
.idea/
build/
out/
22 changes: 22 additions & 0 deletions samples/sample-micronaut/build.gradle.kts
@@ -0,0 +1,22 @@
plugins {
application
}

dependencies {
arrayOf("annotationProcessor", "implementation", "testAnnotationProcessor").forEach {
add(it, platform("io.micronaut:micronaut-bom:1.2.6"))
}
annotationProcessor("io.micronaut:micronaut-inject-java")
implementation(project(":bearerauth-core"))
implementation("io.micronaut:micronaut-http-server-netty")
implementation("io.micronaut:micronaut-inject")
runtimeOnly("ch.qos.logback:logback-classic:1.2.3")
testAnnotationProcessor("io.micronaut:micronaut-inject-java")
testImplementation("io.micronaut.test:micronaut-test-junit5")
testImplementation("org.junit.jupiter:junit-jupiter-api")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
}

application {
mainClassName = "sample.SampleMicronautApplication"
}
@@ -0,0 +1,71 @@
package sample;

import io.github.vpavic.bearerauth.AuthorizationContext;
import io.github.vpavic.bearerauth.AuthorizationContextResolver;
import io.github.vpavic.bearerauth.BearerAuthenticationHandler;
import io.github.vpavic.bearerauth.HttpExchange;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.MutableHttpResponse;
import io.micronaut.http.annotation.Filter;
import io.micronaut.http.filter.OncePerRequestHttpServerFilter;
import io.micronaut.http.filter.ServerFilterChain;
import io.reactivex.Completable;
import org.reactivestreams.Publisher;

import java.time.Instant;
import java.util.Collections;
import java.util.concurrent.CompletableFuture;

@Filter("/**")
public class MicronautBearerAuthenticationFilter extends OncePerRequestHttpServerFilter {

private final BearerAuthenticationHandler bearerAuthenticationHandler;

public MicronautBearerAuthenticationFilter() {
this.bearerAuthenticationHandler = BearerAuthenticationHandler.builder(
bearerToken -> authorizationContextResolver().apply(bearerToken)).build();
}

private AuthorizationContextResolver authorizationContextResolver() {
return bearerToken -> {
switch (bearerToken.toString()) {
case "valid":
return CompletableFuture.completedFuture(
new AuthorizationContext(Collections.emptySet(), Instant.MAX, Collections.emptyMap()));
case "expired":
return CompletableFuture.completedFuture(
new AuthorizationContext(Collections.emptySet(), Instant.MIN, Collections.emptyMap()));
default:
return CompletableFuture.completedFuture(null);
}
};
}

@Override
public Publisher<MutableHttpResponse<?>> doFilterOnce(HttpRequest<?> request, ServerFilterChain chain) {
return Completable.fromFuture(
this.bearerAuthenticationHandler.handle(new MicronautHttpExchange(request)).toCompletableFuture())
.andThen(chain.proceed(request));
}

private static class MicronautHttpExchange implements HttpExchange {

private final HttpRequest<?> httpRequest;

private MicronautHttpExchange(HttpRequest<?> httpRequest) {
this.httpRequest = httpRequest;
}

@Override
public String getRequestHeader(String headerName) {
return this.httpRequest.getHeaders().get(headerName);
}

@Override
public void setAttribute(String attributeName, Object attributeValue) {
this.httpRequest.setAttribute(attributeName, attributeValue);
}

}

}
@@ -0,0 +1,11 @@
package sample;

import io.micronaut.runtime.Micronaut;

public class SampleMicronautApplication {

public static void main(String[] args) {
Micronaut.run(SampleMicronautApplication.class, args);
}

}
22 changes: 22 additions & 0 deletions samples/sample-micronaut/src/main/java/sample/TestController.java
@@ -0,0 +1,22 @@
package sample;

import io.github.vpavic.bearerauth.AuthorizationContext;
import io.github.vpavic.bearerauth.BearerAuthenticationHandler;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/resource")
public class TestController {

@Get(produces = MediaType.TEXT_PLAIN)
public String greet(HttpRequest<?> request) {
request.getAttribute(BearerAuthenticationHandler.AUTHORIZATION_CONTEXT_ATTRIBUTE, AuthorizationContext.class)
.ifPresent(authorizationContext -> System.out.println("authorizationContext{scope="
+ String.join(",", authorizationContext.getScope()) + ",expiry="
+ authorizationContext.getExpiry() + "}"));
return "Hello World!";
}

}
11 changes: 11 additions & 0 deletions samples/sample-micronaut/src/main/resources/logback.xml
@@ -0,0 +1,11 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>

<root level="info">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
@@ -0,0 +1,13 @@
package sample;

import io.micronaut.test.annotation.MicronautTest;
import org.junit.jupiter.api.Test;

@MicronautTest
class SampleMicronautApplicationTests {

@Test
void contextLoads() {
}

}
1 change: 1 addition & 0 deletions settings.gradle.kts
Expand Up @@ -15,5 +15,6 @@ pluginManagement {
rootProject.name = "bearerauth"

include("bearerauth-core")
include("samples:sample-micronaut")
include("samples:sample-spring-servlet")
include("samples:sample-spring-webflux")

0 comments on commit bc8977b

Please sign in to comment.