我正在尝试将 CAS 身份验证集成到我们的 Web 服务中并使用 Jasig CAS server (v. 4.2) 这是基于 Spring 的 web 应用程序。
不幸的是,Jasig CAS服务器只能在成功登录后使用服务ID进行重定向。 这是 Not Acceptable ,因为 CAS 服务器位于反向代理后面,而且我们不使用 DNS。 因此,登录 URL 如下所示:
http://a.b.c.d/cas/login?service=http://x.x.x.x/context-path/auth-entry-point
哪里
- a.b.c.d - 外部(代理)IP 地址
- x.x.x.x - 内部(服务/CAS 客户端)IP 地址
我已阅读 Jasig 文档,但找不到混淆服务 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 参数、解码并将其用于重定向?
附注抱歉我的英语不好,我希望它至少是可以解析的:-)
最佳答案
好吧,这很简单。对于任何感兴趣的人:
在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}"/>
关于spring-webflow - Jasig CAS - 如何自定义WebFlow以在成功登录后重定向用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36546889/