参考文档:https://blog.youkuaiyun.com/hewusheng10/article/details/108328013
最近参与的门户项目中,涉及到多个业务系统单点登录功能,于是使用了cas作为单点登录统一认证门户。 而cas-server 采用的5.3的springboot版本,在安全验收过程中,发现cas内置的tomcat版本存在漏洞,需要进行tomcat升级。通过文档收集大部分建议直接对cas进行整体升级,然而由于cas已经上线,本着最小范围影响原则,所以我们采用了cas的内置tomcat版本升级。操作步骤如下:
第一步: 理解cas的pom中overlay插件的使用:
cas与springboot的融合,主要通过MAVEN的overlay插件,将cas-server源码项目和cas-server-webapp-tomcat进行合并。
overlay插件是用户多个web项目的war包合并,被依赖的war包会根据pom中的配置以及主项目的现有文件进行合并。用途:1.大型web项目的并行开发。在分布式的趋势下,这个用途应该不多了。2.基于他人项目的修改,比如:cas本身用来做登陆权限的中央认证,其中项目源码非常之多,但本身必须是一个持续运行在服务器上的web项目,对于开发者而言只是需要在cas代码上根据业务做一些修改,涉及到的文件可能只有三四个,而其他多余的东西完全用不到,这就会导致项目看起来十分累赘、冗余。时间一久也忘了几十上百个文件中到底修改了那些。
而使用overlay插件的好处在于:1.项目看起来更加清爽。2.因为项目中的已有的文件就是自己定义的文件,即使是后面接手的人,也一目了然、便于维护。3.提高开发效率,若用传统方式需要提取所以文件到项目,一旦漏掉哪个就会导致报错,编写代码也不会因为代码文件太多太庞大,导致编译工具卡顿,最终运行的版本会在项目运行时先合并再编译运行。
以cas4.0.3为例,左边传统方式,右边使用overlay插件
可以看出项目立即变得清爽,需要自定义什么内容,只需要在项目中创建对应目录结构下的同名文件即可。
overlay插件的用法
1.首先创建一个干净清爽的maven webapp项目
2.打开pom文件加入overlay的插件,将overlay里面的war包依赖加入到dependencies中:
其中标签下可以加入多个也就是支持多个war包的合并,填写时只需写入和不需要版本号。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warName>cas</warName>
<failOnMissingWebXml>false</failOnMissingWebXml>
<recompressZippedFiles>false</recompressZippedFiles>
<archive>
<compress>false</compress>
<manifestFile>${manifestFileToUse}</manifestFile>
</archive>
<overlays>
<overlay>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-webapp${app.server}</artifactId>
<excludes>
<exclude>WEB-INF/lib/tomcat*</exclude>
</excludes>
</overlay>
</overlays>
</configuration>
</plugin>
3.此时项目中会多一个overlay的目录:
需要修改什么内容,则参照overlay里面的结构去创建同样的目录和文件即可,如各种filter和spring的配置文件的扫描路径是通用的
4、自定义一个登陆界面
直接替换WEB-INF/view/jsp/default/ui/casLoginView.jsp即可完成对登陆界面的修改。
先创建一个同目录下的同名文件,直接重写即可替换:
5、includes与excludes的用法
overlay下的exclude下匹配的文件不会出现在最终合并target中,也就是启动环境中去。这个可以用于一些主项目用不到的资源文件可以用exclude直接移除掉。
overlay下若有include的配置,则最终合并的文件只包含include下匹配的文件
include用于让开发者去灵活选择overlay中只需要用到的资源。
6、dependentWarIncludes与dependentWarExcludes这两个和include与exclude用法一致,前者配置只合并的文件,后者配置不合并的文件。那么和include与exclude的区别是啥呢?
先看pom用法:
<configuration>
<overlays>
<overlay>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<includes>
<include>WEB-INF/view/jsp/**</include>
</includes>
</overlay>
</overlays>
<!--<dependentWarIncludes>WEB-INF/web.xml</dependentWarIncludes>-->
<dependentWarIncludes>WEB-INF/**</dependentWarIncludes>
<dependentWarExcludes>WEB-INF/view/jsp/default/ui/casLogoutView.jsp</dependentWarExcludes>
</configuration>
可以看到用法是直接写在configuration节点下,也就是说,这个配置对所有overlay都起作用,前提是overlay下没有include与exclude,也就是说dependentWarIncludes和dependentWarExcludes是全局作用,每个overlay下的war包都会被应用到该配置,但是优先级要低于include与exclude。
第二步: 确认cas内置tomcat升级
1、查询cas中的tomcat依赖内容,通过mvn打包后,查询war包涉及的tomcat依赖
2、查找cas内置的tomcat来源。
通过pom中查询cas并没有直接引入tomcat相关包,于是通过pom怀疑,tomcat相关依赖包由 相关的war包依赖合并而来。通过项目中的 overlays目录下,相关合并的war包(org.apereo.cas.cas-server-webapp-tomcat-5.3.16)内的\WEB-INF\lib 目录查找到tomcat相关依赖。
3、在cas的pom中引入org.apereo.cas.cas-server-webapp-tomcat-5.3.16包相关的tomcat依赖,确保tomcat相关依赖已引入升级版本
<!--额外增加的tomcat版本-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-coyote</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-el-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jaspic-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jni</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-tribes</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-util</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-util-scan</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina-ha</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>${tomcat.version}</version>
</dependency>
通过打包发现,cas内置的tomcat相关依赖,两个版本同时存在,说明tomcat新版本引入成功,接下来是删除原有旧的依赖版本
3、overlay下的exclude移除旧的内置tomcat依赖
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warName>cas</warName>
<failOnMissingWebXml>false</failOnMissingWebXml>
<recompressZippedFiles>false</recompressZippedFiles>
<archive>
<compress>false</compress>
<manifestFile>${manifestFileToUse}</manifestFile>
</archive>
<overlays>
<overlay>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-webapp${app.server}</artifactId>
<excludes>
<exclude>WEB-INF/lib/tomcat*</exclude>
</excludes>
</overlay>
</overlays>
</configuration>
</plugin>
4、验证,cas内置依赖中,旧的tomcat依赖已删除。升级为新的tomcat依赖