Loading vospace-ui-backend/pom.xml +36 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,11 @@ <artifactId>vospace-datamodel</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>auth-lib</artifactId> <version>2.0.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> Loading @@ -47,6 +52,37 @@ </dependency> </dependencies> <profiles> <profile> <id>include-gui</id> <build> <plugins> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>copy-resources</id> <phase>prepare-package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/classes/static</outputDirectory> <resources> <resource> <directory>../vospace-ui-frontend/dist</directory> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> <build> <finalName>vospace-ui</finalName> <plugins> Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/VOSpaceUiApplication.java +18 −0 Original line number Diff line number Diff line package it.inaf.ia2.vospace.ui; import it.inaf.ia2.aa.LoginFilter; import it.inaf.ia2.aa.ServiceLocator; import it.inaf.ia2.aa.UserManager; import java.util.concurrent.ForkJoinPool; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; @SpringBootApplication public class VOSpaceUiApplication { Loading @@ -11,6 +16,19 @@ public class VOSpaceUiApplication { SpringApplication.run(VOSpaceUiApplication.class, args); } @Bean public FilterRegistrationBean loginFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new LoginFilter()); registration.addUrlPatterns("/login"); return registration; } @Bean public UserManager userManager() { return ServiceLocator.getInstance().getUserManager(); } /** * Solves a ClassLoader issue. See class JaxbForkJoinWorkerThreadFactory. */ Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java +24 −1 Original line number Diff line number Diff line package it.inaf.ia2.vospace.ui.client; import com.fasterxml.jackson.databind.ObjectMapper; import it.inaf.ia2.aa.data.User; import it.inaf.ia2.vospace.ui.VOSpaceException; import it.inaf.ia2.vospace.ui.VOSpaceUiApplication; import java.io.IOException; Loading @@ -16,10 +17,13 @@ import java.util.Scanner; import java.util.concurrent.CompletionException; import java.util.concurrent.ForkJoinPool; import java.util.function.Function; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.xml.bind.JAXB; import net.ivoa.xml.vospace.v2.Node; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; Loading @@ -37,6 +41,9 @@ public class VOSpaceClient { private final String baseUrl; private final ForkJoinPool jaxbExecutor; @Autowired private HttpServletRequest servletRequest; public VOSpaceClient(@Value("${vospace-backend-url}") String backendUrl) { if (backendUrl.endsWith("/")) { // Remove final slash from configured URL Loading Loading @@ -90,7 +97,23 @@ public class VOSpaceClient { } private HttpRequest.Builder getRequest(String path) { return HttpRequest.newBuilder(URI.create(baseUrl + path)); HttpRequest.Builder builder = HttpRequest.newBuilder(URI.create(baseUrl + path)); String token = getToken(); if (token != null) { builder.setHeader("Authorization", "Bearer " + token); } return builder; } private String getToken() { HttpSession session = servletRequest.getSession(false); if (session != null) { User user = (User) session.getAttribute("user_data"); if (user != null) { return user.getAccessToken(); } } return null; } private <T> T parseJson(InputStream in, Class<T> type) { Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/UserController.java 0 → 100644 +49 −0 Original line number Diff line number Diff line package it.inaf.ia2.vospace.ui.controller; import it.inaf.ia2.aa.UserManager; import it.inaf.ia2.aa.data.User; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; @RestController public class UserController { @Autowired private UserManager userManager; @GetMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE) public Map<String, String> getUserInfo(HttpSession session) { User user = (User) session.getAttribute("user_data"); String username = user == null ? "anonymous" : user.getUserLabel(); Map<String, String> response = new HashMap<>(); response.put("username", username); return response; } @GetMapping(value = "/keepalive", produces = MediaType.APPLICATION_JSON_VALUE) public void refresh(HttpSession session, HttpServletRequest request) { User user = (User) session.getAttribute("user_data"); if (user != null && user.getExpiresIn() < 120) { userManager.refreshToken(request); } } // NOTE: endpoint /logout is defined by Spring and it trigger a login again, so /vospace-logout is used @GetMapping(value = "/vospace-logout", produces = MediaType.TEXT_HTML_VALUE) public void index(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpSession session = request.getSession(); if (session != null) { session.invalidate(); } String baseUrl = ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString(); response.sendRedirect(baseUrl); } } vospace-ui-backend/src/main/resources/auth.properties 0 → 100644 +9 −0 Original line number Diff line number Diff line client_id=vospace_local client_secret=vospace rap_uri=http://localhost/rap-ia2 gms_uri=http://localhost:8082/gms groups_autoload=false store_state_on_login_endpoint=true scope=openid email profile read:rap Loading
vospace-ui-backend/pom.xml +36 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,11 @@ <artifactId>vospace-datamodel</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>auth-lib</artifactId> <version>2.0.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> Loading @@ -47,6 +52,37 @@ </dependency> </dependencies> <profiles> <profile> <id>include-gui</id> <build> <plugins> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>copy-resources</id> <phase>prepare-package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/classes/static</outputDirectory> <resources> <resource> <directory>../vospace-ui-frontend/dist</directory> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> <build> <finalName>vospace-ui</finalName> <plugins> Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/VOSpaceUiApplication.java +18 −0 Original line number Diff line number Diff line package it.inaf.ia2.vospace.ui; import it.inaf.ia2.aa.LoginFilter; import it.inaf.ia2.aa.ServiceLocator; import it.inaf.ia2.aa.UserManager; import java.util.concurrent.ForkJoinPool; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; @SpringBootApplication public class VOSpaceUiApplication { Loading @@ -11,6 +16,19 @@ public class VOSpaceUiApplication { SpringApplication.run(VOSpaceUiApplication.class, args); } @Bean public FilterRegistrationBean loginFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new LoginFilter()); registration.addUrlPatterns("/login"); return registration; } @Bean public UserManager userManager() { return ServiceLocator.getInstance().getUserManager(); } /** * Solves a ClassLoader issue. See class JaxbForkJoinWorkerThreadFactory. */ Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java +24 −1 Original line number Diff line number Diff line package it.inaf.ia2.vospace.ui.client; import com.fasterxml.jackson.databind.ObjectMapper; import it.inaf.ia2.aa.data.User; import it.inaf.ia2.vospace.ui.VOSpaceException; import it.inaf.ia2.vospace.ui.VOSpaceUiApplication; import java.io.IOException; Loading @@ -16,10 +17,13 @@ import java.util.Scanner; import java.util.concurrent.CompletionException; import java.util.concurrent.ForkJoinPool; import java.util.function.Function; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.xml.bind.JAXB; import net.ivoa.xml.vospace.v2.Node; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; Loading @@ -37,6 +41,9 @@ public class VOSpaceClient { private final String baseUrl; private final ForkJoinPool jaxbExecutor; @Autowired private HttpServletRequest servletRequest; public VOSpaceClient(@Value("${vospace-backend-url}") String backendUrl) { if (backendUrl.endsWith("/")) { // Remove final slash from configured URL Loading Loading @@ -90,7 +97,23 @@ public class VOSpaceClient { } private HttpRequest.Builder getRequest(String path) { return HttpRequest.newBuilder(URI.create(baseUrl + path)); HttpRequest.Builder builder = HttpRequest.newBuilder(URI.create(baseUrl + path)); String token = getToken(); if (token != null) { builder.setHeader("Authorization", "Bearer " + token); } return builder; } private String getToken() { HttpSession session = servletRequest.getSession(false); if (session != null) { User user = (User) session.getAttribute("user_data"); if (user != null) { return user.getAccessToken(); } } return null; } private <T> T parseJson(InputStream in, Class<T> type) { Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/UserController.java 0 → 100644 +49 −0 Original line number Diff line number Diff line package it.inaf.ia2.vospace.ui.controller; import it.inaf.ia2.aa.UserManager; import it.inaf.ia2.aa.data.User; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; @RestController public class UserController { @Autowired private UserManager userManager; @GetMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE) public Map<String, String> getUserInfo(HttpSession session) { User user = (User) session.getAttribute("user_data"); String username = user == null ? "anonymous" : user.getUserLabel(); Map<String, String> response = new HashMap<>(); response.put("username", username); return response; } @GetMapping(value = "/keepalive", produces = MediaType.APPLICATION_JSON_VALUE) public void refresh(HttpSession session, HttpServletRequest request) { User user = (User) session.getAttribute("user_data"); if (user != null && user.getExpiresIn() < 120) { userManager.refreshToken(request); } } // NOTE: endpoint /logout is defined by Spring and it trigger a login again, so /vospace-logout is used @GetMapping(value = "/vospace-logout", produces = MediaType.TEXT_HTML_VALUE) public void index(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpSession session = request.getSession(); if (session != null) { session.invalidate(); } String baseUrl = ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString(); response.sendRedirect(baseUrl); } }
vospace-ui-backend/src/main/resources/auth.properties 0 → 100644 +9 −0 Original line number Diff line number Diff line client_id=vospace_local client_secret=vospace rap_uri=http://localhost/rap-ia2 gms_uri=http://localhost:8082/gms groups_autoload=false store_state_on_login_endpoint=true scope=openid email profile read:rap