Skip to content
GmsLoginFilter.java 1.57 KiB
Newer Older
Sonia Zorba's avatar
Sonia Zorba committed
/*
 * This file is part of gms
 * Copyright (C) 2021 Istituto Nazionale di Astrofisica
 * SPDX-License-Identifier: GPL-3.0-or-later
 */
package it.inaf.ia2.gms.authn;

import it.inaf.ia2.aa.LoginFilter;
import java.io.IOException;
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 org.springframework.util.AntPathMatcher;

public class GmsLoginFilter extends LoginFilter {

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

        HttpServletRequest request = (HttpServletRequest) req;

        if (shouldNotFilter(request)) {
            fc.doFilter(req, res);
        } else {
            super.doFilter(req, res, fc);
        }
    }

    private boolean shouldNotFilter(HttpServletRequest request) throws ServletException {

        if (request.getUserPrincipal() != null) {
            // Principal set using JWT
            return true;
        }

        // Allow CORS check
        if ("OPTIONS".equals(request.getMethod())) {
            return true;
        }

        AntPathMatcher pathMatcher = new AntPathMatcher();

        // Authentication is ignored for these endpoints:
        return Arrays.asList("/ws/jwt/**", "/error", "/logout", "/invited-registration", "/help/**", "/vo/capabilities", "/vo/availability")
                .stream()
                .anyMatch(p -> pathMatcher.match(p, request.getServletPath()));
    }
}