java 在cas客户端和Liferay中获得我自己的属性

1dkrff03  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(126)

我有一个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原始的类,并自定义获取参数值的过程,但它并不真正干净,不是吗?

wsxa1bj1

wsxa1bj11#

我该从何说起呢?
现在是2023年,不仅您的CAS客户端已经过时,而且您的整个Liferay安装也已经过时。很可能你只会发现人们对这个> 10岁的老平台有古老的知识,从那时起,它已经经历了重大的建筑变化。
关于财产价值:它们永远不会被自动替换,只是因为它们是某些属性文件的一部分。替换是显式的,对于少数地方的一些(少数)值。
曾经有关于如何在系统中引入另一个过滤器的文档,但我不确定5.x文档是否仍然存在。事实上,我建议使用现有的过滤器作为基础。它可能并不优雅,但在服务器上运行一个过时的版本,并存在已知的安全问题。您应该能够大致遵循6.x文档,您仍然可以在网上找到(可能需要一些小的调整,您会遇到它们)
我建议的实际解决方案是升级您的系统-尽管我已经很久没有听说过CAS了。验证是否仍然支持。

相关问题