2

我正在尝试将 CAS 身份验证集成到我们的 Web 服务中,并使用Jasig CAS 服务器(v. 4.2),它是基于 Spring 的 Web 应用程序。

不幸的是,Jasig CAS 服务器在成功登录后只能使用服务 ID 进行重定向。这是不可接受的,因为 CAS 服务器位于反向代理后面,我们不使用 DNS。因此,登录 URL 如下所示:

http://a.b.c.d/cas/login?service=http://x.x.x.x/context-path/auth-entry-point

在哪里

  • abcd - 外部(代理)IP 地址
  • xxxx - 内部(服务/CAS 客户端)IP 地址

我已阅读 Jasig 文档,但找不到混淆服务 URL 的方法。现在我正在尝试实现自定义逻辑。我想将重定向 url 作为单独的参数传递:

http://a.b.c.d/login?service=<serviceUID_like_YYY-YYY-YYY>&redirect=<base64_encoded_URL>

.. 并使用此参数而不是服务 ID 进行重定向。

根据文档 Jasig CAS 使用 Spring Webflow 来实现登录场景(login-webflow.xml)。这就是重定向引起的地方:

<end-state id="redirectView" view="externalRedirect:#{requestScope.response.url}"/>

由于我不熟悉 Spring Weblow,所以问题是:

如何接收“重定向” URL 参数、解码并将其用于重定向?

PS对不起我的英语不好,我希望它至少是可解析的:-)

4

1 回答 1

2

好的,这很简单。对于任何有兴趣的人:

在org.jasig.cas.*包下创建自定义服务 bean :

package org.jasig.cas.usercustom;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;

@Component("userCustomRedirectHelper")
public class RedirectHelper {

    final static Logger logger = LoggerFactory.getLogger(RedirectHelper.class);

    public String decodeURLFromString(String src) {
        String url = new String(Base64Utils.decodeFromString(src));
        logger.debug("Redirect URL: " + src);
        return url;
    }
}

修改login-webflow.xml如下:

<on-start>
    <!-- get redirect param, decode and place into flowScope -->
    <evaluate expression="userCustomRedirectHelper.decodeURLFromString(requestParameters.redirect)" result="flowScope.customRedirectURL" />
</on-start>

<!-- redirect -->
<end-state id="redirectView" view="externalRedirect:#{flowScope.customRedirectURL}"/>
于 2016-04-12T08:54:31.760 回答