Commit 314c77a3 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Handled login in UI backend

parent 3bb31e3c
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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>
+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 {
@@ -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.
     */
+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;
@@ -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;

@@ -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
@@ -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) {
+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);
    }
}
+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