我有一个Liferay 5项目。所使用的基本cas客户端很旧,我需要将其更新为cas客户端v3.2.1
因此,我更新了服务器上的jar,并修改了Liferay的web.xml:
<filter>
<filter-name>SSO CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>test</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>test</param-value>
</init-param>
</filter>
<filter>
<filter-name>CASValidationFilter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>test</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>test</param-value>
</init-param>
</filter>
效果很好。
但是,我现在想让serverName和casServerLoginUrl的param-value动态填充一些属性文件或系统属性。
我尝试用途:
${cas.login.url}
并将其放入portal-ext.properties文件中。
但值不会被替换。
如果我检查org.jasig.cas.client.authentication.AuthenticationFilter类,似乎加载过程是这样的:
protected final String getPropertyFromInitParams(final FilterConfig filterConfig, final String propertyName, final String defaultValue) {
final String value = filterConfig.getInitParameter(propertyName);
if (CommonUtils.isNotBlank(value)) {
log.info("Property [" + propertyName + "] loaded from FilterConfig.getInitParameter with value [" + value + "]");
return value;
}
final String value2 = filterConfig.getServletContext().getInitParameter(propertyName);
if (CommonUtils.isNotBlank(value2)) {
log.info("Property [" + propertyName + "] loaded from ServletContext.getInitParameter with value [" + value2 + "]");
return value2;
}
InitialContext context;
try {
context = new InitialContext();
} catch (final NamingException e) {
log.warn(e,e);
return defaultValue;
}
final String shortName = this.getClass().getName().substring(this.getClass().getName().lastIndexOf(".")+1);
final String value3 = loadFromContext(context, "java:comp/env/cas/" + shortName + "/" + propertyName);
if (CommonUtils.isNotBlank(value3)) {
log.info("Property [" + propertyName + "] loaded from JNDI Filter Specific Property with value [" + value3 + "]");
return value3;
}
final String value4 = loadFromContext(context, "java:comp/env/cas/" + propertyName);
if (CommonUtils.isNotBlank(value4)) {
log.info("Property [" + propertyName + "] loaded from JNDI with value [" + value4 + "]");
return value4;
}
log.info("Property [" + propertyName + "] not found. Using default value [" + defaultValue + "]");
return defaultValue;
}
因此,它应该获取${cas.login.url},Liferay基于他的portal-ext.properties机制,应该动态替换该值。
但它不起作用。
唯一的解决方案似乎是将AuthenticationFilter类复制到我的项目中,扩展cas-client原始的类,并自定义获取参数值的过程,但它并不真正干净,不是吗?
1条答案
按热度按时间wsxa1bj11#
我该从何说起呢?
现在是2023年,不仅您的CAS客户端已经过时,而且您的整个Liferay安装也已经过时。很可能你只会发现人们对这个> 10岁的老平台有古老的知识,从那时起,它已经经历了重大的建筑变化。
关于财产价值:它们永远不会被自动替换,只是因为它们是某些属性文件的一部分。替换是显式的,对于少数地方的一些(少数)值。
曾经有关于如何在系统中引入另一个过滤器的文档,但我不确定5.x文档是否仍然存在。事实上,我建议使用现有的过滤器作为基础。它可能并不优雅,但在服务器上运行一个过时的版本,并存在已知的安全问题。您应该能够大致遵循6.x文档,您仍然可以在网上找到(可能需要一些小的调整,您会遇到它们)
我建议的实际解决方案是升级您的系统-尽管我已经很久没有听说过CAS了。验证是否仍然支持。