Skip to content

Commit 25d10ef

Browse files
authored
JaxRs authenticationfilter, drop JA-spi (#2549)
1 parent 9ed3966 commit 25d10ef

File tree

7 files changed

+76
-105
lines changed

7 files changed

+76
-105
lines changed

web/pom.xml

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,8 @@
5656

5757
<!-- Server Provided Libraries. Transitive avhengigheter som ikke burde vært her da de trekkes inn av server. -->
5858
<dependency>
59-
<groupId>no.nav.foreldrepenger.felles.sikkerhet</groupId>
60-
<artifactId>felles-sikkerhet</artifactId>
61-
<exclusions>
62-
<exclusion>
63-
<groupId>org.codehaus.woodstox</groupId>
64-
<artifactId>woodstox-core-asl</artifactId>
65-
</exclusion>
66-
</exclusions>
59+
<groupId>no.nav.foreldrepenger.felles</groupId>
60+
<artifactId>felles-auth-filter</artifactId>
6761
</dependency>
6862
<dependency>
6963
<groupId>no.nav.foreldrepenger.felles</groupId>
@@ -121,23 +115,11 @@
121115
<groupId>org.eclipse.jetty.ee10</groupId>
122116
<artifactId>jetty-ee10-plus</artifactId>
123117
</dependency>
124-
<dependency>
125-
<groupId>org.eclipse.jetty.ee10</groupId>
126-
<artifactId>jetty-ee10-annotations</artifactId>
127-
</dependency>
128118
<dependency>
129119
<groupId>org.eclipse.jetty.ee10</groupId>
130120
<artifactId>jetty-ee10-cdi</artifactId>
131121
</dependency>
132122

133-
<dependency>
134-
<groupId>org.eclipse.jetty</groupId>
135-
<artifactId>jetty-security</artifactId>
136-
</dependency>
137-
<dependency>
138-
<groupId>org.eclipse.jetty.ee10</groupId>
139-
<artifactId>jetty-ee10-jaspi</artifactId>
140-
</dependency>
141123
<dependency>
142124
<groupId>org.eclipse.jetty.ee10</groupId>
143125
<artifactId>jetty-ee10-webapp</artifactId>

web/src/main/java/no/nav/foreldrepenger/abakus/app/konfig/ApiConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public Set<Class<?>> getClasses() {
7575

7676
ForvaltningRestTjeneste.class, DiagnostikkRestTjeneste.class, RapporteringRestTjeneste.class,
7777

78-
OpenApiResource.class, JacksonJsonConfig.class, ConstraintViolationMapper.class, JsonMappingExceptionMapper.class,
78+
AuthenticationFilter.class, OpenApiResource.class, JacksonJsonConfig.class, ConstraintViolationMapper.class, JsonMappingExceptionMapper.class,
7979
JsonParseExceptionMapper.class, GeneralRestExceptionMapper.class);
8080
}
8181

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package no.nav.foreldrepenger.abakus.app.konfig;
2+
3+
import jakarta.annotation.Priority;
4+
import jakarta.ws.rs.Priorities;
5+
import jakarta.ws.rs.container.ContainerRequestContext;
6+
import jakarta.ws.rs.container.ContainerRequestFilter;
7+
import jakarta.ws.rs.container.ContainerResponseContext;
8+
import jakarta.ws.rs.container.ContainerResponseFilter;
9+
import jakarta.ws.rs.container.ResourceInfo;
10+
import jakarta.ws.rs.core.Context;
11+
import jakarta.ws.rs.ext.Provider;
12+
import no.nav.vedtak.sikkerhet.jaxrs.AuthenticationFilterDelegate;
13+
14+
@Provider
15+
@Priority(Priorities.AUTHENTICATION)
16+
public class AuthenticationFilter implements ContainerRequestFilter, ContainerResponseFilter {
17+
18+
@Context
19+
private ResourceInfo resourceinfo;
20+
21+
public AuthenticationFilter() {
22+
// Ingenting
23+
}
24+
25+
@Override
26+
public void filter(ContainerRequestContext req, ContainerResponseContext res) {
27+
AuthenticationFilterDelegate.fjernKontekst();
28+
}
29+
30+
@Override
31+
public void filter(ContainerRequestContext req) {
32+
AuthenticationFilterDelegate.validerSettKontekst(resourceinfo, req);
33+
}
34+
35+
}

web/src/main/java/no/nav/foreldrepenger/abakus/app/konfig/EksternApiConfig.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
import java.util.Set;
66
import java.util.stream.Collectors;
77

8-
import jakarta.ws.rs.ApplicationPath;
9-
import jakarta.ws.rs.core.Application;
10-
118
import org.glassfish.jersey.server.ServerProperties;
129

1310
import io.swagger.v3.jaxrs2.integration.JaxrsOpenApiContextBuilder;
@@ -17,6 +14,8 @@
1714
import io.swagger.v3.oas.models.OpenAPI;
1815
import io.swagger.v3.oas.models.info.Info;
1916
import io.swagger.v3.oas.models.servers.Server;
17+
import jakarta.ws.rs.ApplicationPath;
18+
import jakarta.ws.rs.core.Application;
2019
import no.nav.foreldrepenger.abakus.app.exceptions.ConstraintViolationMapper;
2120
import no.nav.foreldrepenger.abakus.app.exceptions.GeneralRestExceptionMapper;
2221
import no.nav.foreldrepenger.abakus.app.exceptions.JsonMappingExceptionMapper;
@@ -62,6 +61,7 @@ public Set<Class<?>> getClasses() {
6261

6362
return Set.of(EksternDelingAvYtelserRestTjeneste.class,
6463
// Applikasjonsoppsett
64+
AuthenticationFilter.class,
6565
JacksonJsonConfig.class,
6666
// Swagger
6767
OpenApiResource.class,

web/src/main/java/no/nav/foreldrepenger/abakus/app/konfig/InternalApiConfig.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@
44

55
import jakarta.ws.rs.ApplicationPath;
66
import jakarta.ws.rs.core.Application;
7-
8-
import no.nav.foreldrepenger.abakus.app.metrics.PrometheusRestService;
97
import no.nav.foreldrepenger.abakus.app.healthcheck.HealthCheckRestService;
8+
import no.nav.foreldrepenger.abakus.app.metrics.PrometheusRestService;
109

11-
@ApplicationPath(InternalApiConfig.API_URL)
10+
@ApplicationPath(InternalApiConfig.API_URI)
1211
public class InternalApiConfig extends Application {
1312

14-
public static final String API_URL = "internal";
13+
public static final String API_URI = "/internal";
1514

1615
public InternalApiConfig() {
1716
// CDI

web/src/main/java/no/nav/foreldrepenger/abakus/jetty/JettyServer.java

Lines changed: 32 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,29 @@
1111

1212
import org.eclipse.jetty.ee10.cdi.CdiDecoratingListener;
1313
import org.eclipse.jetty.ee10.cdi.CdiServletContainerInitializer;
14-
import org.eclipse.jetty.plus.jndi.EnvEntry;
15-
import org.eclipse.jetty.ee10.security.jaspi.DefaultAuthConfigFactory;
16-
import org.eclipse.jetty.ee10.security.jaspi.JaspiAuthenticatorFactory;
17-
import org.eclipse.jetty.ee10.security.jaspi.provider.JaspiAuthConfigProvider;
14+
import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler;
15+
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
16+
import org.eclipse.jetty.ee10.servlet.security.ConstraintMapping;
1817
import org.eclipse.jetty.ee10.servlet.security.ConstraintSecurityHandler;
1918
import org.eclipse.jetty.ee10.webapp.WebAppContext;
20-
import org.eclipse.jetty.security.DefaultIdentityService;
21-
import org.eclipse.jetty.security.SecurityHandler;
22-
import org.eclipse.jetty.security.jaas.JAASLoginService;
19+
import org.eclipse.jetty.plus.jndi.EnvEntry;
20+
import org.eclipse.jetty.security.Constraint;
2321
import org.eclipse.jetty.server.Connector;
24-
import org.eclipse.jetty.server.Handler;
2522
import org.eclipse.jetty.server.HttpConfiguration;
2623
import org.eclipse.jetty.server.HttpConnectionFactory;
27-
import org.eclipse.jetty.server.Request;
28-
import org.eclipse.jetty.server.Response;
2924
import org.eclipse.jetty.server.Server;
3025
import org.eclipse.jetty.server.ServerConnector;
3126
import org.eclipse.jetty.server.handler.ContextHandler;
32-
import org.eclipse.jetty.util.Callback;
3327
import org.eclipse.jetty.util.resource.ResourceFactory;
3428
import org.flywaydb.core.Flyway;
3529
import org.flywaydb.core.api.FlywayException;
3630
import org.slf4j.Logger;
3731
import org.slf4j.LoggerFactory;
38-
import org.slf4j.MDC;
3932

40-
import jakarta.security.auth.message.config.AuthConfigFactory;
33+
import no.nav.foreldrepenger.abakus.app.konfig.ApiConfig;
34+
import no.nav.foreldrepenger.abakus.app.konfig.EksternApiConfig;
35+
import no.nav.foreldrepenger.abakus.app.konfig.InternalApiConfig;
4136
import no.nav.foreldrepenger.konfig.Environment;
42-
import no.nav.vedtak.sikkerhet.jaspic.OidcAuthModule;
4337

4438
public class JettyServer {
4539

@@ -84,20 +78,17 @@ private static void initTrustStore() {
8478
}
8579

8680
private ContextHandler createContext() throws IOException {
87-
var ctx = new WebAppContext();
81+
var ctx = new WebAppContext(CONTEXT_PATH, null, simpleConstraints(), null,
82+
new ErrorPageErrorHandler(), ServletContextHandler.NO_SESSIONS);
83+
8884
ctx.setParentLoaderPriority(true);
8985

9086
// må hoppe litt bukk for å hente web.xml fra classpath i stedet for fra filsystem.
91-
String descriptor;
9287
String baseResource;
9388
try (var factory = ResourceFactory.closeable()) {
94-
var resource = factory.newClassLoaderResource("/WEB-INF/web.xml", false);
95-
descriptor = resource.getURI().toURL().toExternalForm();
9689
baseResource = factory.newResource(".").getRealURI().toURL().toExternalForm();
9790
}
98-
ctx.setDescriptor(descriptor);
9991

100-
ctx.setContextPath(CONTEXT_PATH);
10192
ctx.setBaseResourceAsString(baseResource);
10293
ctx.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false"); // Default servlet convention
10394
ctx.setInitParameter("pathInfoOnly", "true");
@@ -110,7 +101,6 @@ private ContextHandler createContext() throws IOException {
110101
ctx.addServletContainerInitializer(new CdiServletContainerInitializer());
111102
ctx.addServletContainerInitializer(new org.jboss.weld.environment.servlet.EnhancedListener());
112103

113-
ctx.setSecurityHandler(createSecurityHandler());
114104
ctx.setThrowUnavailableOnStartupException(true);
115105

116106
return ctx;
@@ -125,18 +115,6 @@ private static HttpConfiguration createHttpConfiguration() {
125115

126116
}
127117

128-
private static SecurityHandler createSecurityHandler() {
129-
var securityHandler = new ConstraintSecurityHandler();
130-
securityHandler.setAuthenticatorFactory(new JaspiAuthenticatorFactory());
131-
132-
var loginService = new JAASLoginService();
133-
loginService.setName("jetty-login");
134-
loginService.setLoginModuleName("jetty-login");
135-
loginService.setIdentityService(new DefaultIdentityService());
136-
securityHandler.setLoginService(loginService);
137-
return securityHandler;
138-
}
139-
140118
void bootStrap() throws Exception {
141119
konfigurerSikkerhet();
142120
konfigurerJndi();
@@ -148,12 +126,6 @@ private void konfigurerSikkerhet() {
148126
if (ENV.isLocal()) {
149127
initTrustStore();
150128
}
151-
152-
var factory = new DefaultAuthConfigFactory();
153-
factory.registerConfigProvider(new JaspiAuthConfigProvider(new OidcAuthModule()), "HttpServlet", "server " + CONTEXT_PATH,
154-
"OIDC Authentication");
155-
156-
AuthConfigFactory.setFactory(factory);
157129
}
158130

159131
protected void konfigurerJndi() throws NamingException {
@@ -178,8 +150,7 @@ void migrerDatabaser() {
178150
private void start() throws Exception {
179151
var server = new Server(getServerPort());
180152
server.setConnectors(createConnectors(server).toArray(new Connector[]{}));
181-
var handlers = new Handler.Sequence(new ResetLogContextHandler(), createContext());
182-
server.setHandler(handlers);
153+
server.setHandler(createContext());
183154
server.start();
184155
server.join();
185156
}
@@ -192,18 +163,28 @@ private List<Connector> createConnectors(Server server) {
192163
return connectors;
193164
}
194165

166+
private static ConstraintSecurityHandler simpleConstraints() {
167+
var handler = new ConstraintSecurityHandler();
168+
// Slipp gjennom kall fra plattform til JaxRs. Foreløpig kun behov for GET
169+
handler.addConstraintMapping(pathConstraint(Constraint.ALLOWED, InternalApiConfig.API_URI + "/*"));
170+
// Slipp gjennom til autentisering i JaxRs / auth-filter
171+
handler.addConstraintMapping(pathConstraint(Constraint.ALLOWED, ApiConfig.API_URI + "/*"));
172+
// Slipp gjennom til autentisering i JaxRs / auth-filter
173+
handler.addConstraintMapping(pathConstraint(Constraint.ALLOWED, EksternApiConfig.API_URI + "/*"));
174+
// Alt annet av paths og metoder forbudt - 403
175+
handler.addConstraintMapping(pathConstraint(Constraint.FORBIDDEN, "/*"));
176+
return handler;
177+
}
178+
179+
private static ConstraintMapping pathConstraint(Constraint constraint, String path) {
180+
var mapping = new ConstraintMapping();
181+
mapping.setConstraint(constraint);
182+
mapping.setPathSpec(path);
183+
return mapping;
184+
}
185+
195186
private Integer getServerPort() {
196187
return this.serverPort;
197188
}
198189

199-
/**
200-
* Legges først slik at alltid resetter context før prosesserer nye requests. Kjøres først så ikke risikerer andre har satt Request#setHandled(true).
201-
*/
202-
static final class ResetLogContextHandler extends Handler.Abstract {
203-
@Override
204-
public boolean handle(Request request, Response response, Callback callback) {
205-
MDC.clear();
206-
return false;
207-
}
208-
}
209190
}

web/src/main/resources/WEB-INF/web.xml

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)