从spring zuul过滤器重定向到远程URL

时间:2017-05-02 10:09:27

标签: spring-boot single-sign-on netflix-zuul

我正在尝试使用zuul代理服务器实现API网关。 基本上,我想要实现的是当客户端通过网关发送请求来资源服务器时,网关只检查客户端会话是否存在,如果不存在,它将重定向到 SSO 服务器进行身份验证。但是,Zuul过滤器总是进入资源服务器而不重定向到SSO服务器。

下面的

是用于重定向到远程SSO的剪切代码

public Object run() {
    try {
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
        // step 1: check to see whether session exist, if not redirect to federation for authentication
        // if session already exist then adding sessionId to cookie to forwarding to targeting service


       // TODO: comment out for now.
        HttpSession currentSession = context.getRequest().getSession(false);
        String samlAuthenWithRelayUrl = populateFedUrlWithRelay(request);


        if (currentSession==null){

            // redirect to federation with relay URL
            context.setRouteHost( new URL(samlAuthenWithRelayUrl));
           //response.sendRedirect(samlAuthenWithRelayUrl);
        } else{
            HttpSession httpSession =request.getSession();
            context.addZuulRequestHeader(AppConstants.PHOENIX_COOKIE, "SESSION=" +  httpSession.getId());

        }

    } catch (Exception ex) {
        log.error(ex.getMessage(), ex);

        //  redirect to error page
    }

    return null;

}

请告知是否有任何遗漏的部分来实现我的目标,谢谢。

1 个答案:

答案 0 :(得分:1)

API网关永远不应重定向到单点登录服务IMO。网关不是要从浏览器访问,而是从REST客户端库或Postman之类的工具访问。如果身份验证失败,则应返回401响应,而不是302

UNRELATED:如果您有某种使用REST API的服务器端Web UI框架(例如JSF),请阅读

对于对视图(UI服务)的请求,我遇到了与Zuul和Keycloak SSO类似的问题。我无法获得Zuul背后的UI服务,正确执行OpenIdConnect标准流程。我最终只使用Zuul用于Rest API,并让最终用户浏览器直接向UI服务发出请求(我有一个实例)。

Keycloak mailing listwhat I tried中描述了我的问题,以便在此Github回购中修复它。