Skip to content
TokenFilterConfig.java 3.37 KiB
Newer Older
package it.inaf.oats.vospace;

import it.inaf.ia2.aa.TokenFilter;
import it.inaf.ia2.aa.data.User;
import java.io.IOException;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Arrays;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;

@TestConfiguration
public class TokenFilterConfig {

    @Bean
    @Primary
    public FilterRegistrationBean tokenFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new FakeTokenFilter());
        registration.addUrlPatterns("/*");
        return registration;
    }

    private static class FakeTokenFilter extends TokenFilter {

        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;

            String authHeader = request.getHeader("Authorization");

            if (authHeader != null) {
                if (authHeader.startsWith("Bearer ")) {
                    String token = authHeader.substring("Bearer ".length());
                    HttpServletRequestWrapper requestWithPrincipal = new RequestWithPrincipal(request, getFakeUser(token));
                    chain.doFilter(requestWithPrincipal, response);
                    return;
                }
            }

            chain.doFilter(getAnonymousServletRequest(request), response);
        }

        private User getFakeUser(String token) {

            User user = new User();

            switch (token) {
                case "user1_token":
                    user.setUserId("user1").setUserLabel("User1");
                    break;
                case "user2_token":
                    user.setUserId("user2").setUserLabel("User2").setGroups(Arrays.asList("group1", "group2"));
                    break;
                default:
                    throw new IllegalArgumentException("Fake user not configured for token " + token);
            }

            user.setAccessToken(token);

            return user;
        }

        private static HttpServletRequestWrapper getAnonymousServletRequest(HttpServletRequest request) {
            User anonymousUser = new User()
                    .setUserId("anonymous")
                    .setUserLabel("Anonymous")
                    .setGroups(new ArrayList<>());
            return new RequestWithPrincipal(request, anonymousUser);
        }

        private static class RequestWithPrincipal extends HttpServletRequestWrapper {

            private final User user;

            public RequestWithPrincipal(HttpServletRequest request, User user) {
                super(request);
                this.user = user;
            }

            @Override
            public Principal getUserPrincipal() {
                return user;
            }
        }
    }
}