Spring 引导安全升级破坏了 CAS
Spring Boot Security upgrade breaks CAS
我试图让 Spring 引导 + Spring 与 CAS 和 运行 的安全工作陷入一些麻烦。经过一段时间的研究,我发现了 good example project https://github.com/jgribonvald/demo-spring-security-cas
这非常好,我只需要将 CAS URL 更改为我的,它就开始完美地工作了。
它使用 spring boot 1.2.1.RELEASE,我想将它升级到最新版本 (1.5.2.RELEASE)。为了做到这一点,我不得不做一些修改(修复编译错误,因为一些 类 在新版本中被删除了)。
修复编译错误后,我用旧版本对其进行了测试,它仍然有效,但在最新版本中失败了。它抛出 casServerUrlPrefix
在 SingleSignOutFilter
中为空的错误
@Bean
public SingleSignOutFilter singleSignOutFilter() {
SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
singleSignOutFilter.setCasServerUrlPrefix(env.getRequiredProperty(CAS_URL_PREFIX));
// singleSignOutFilter.setIgnoreInitConfiguration(true);
return singleSignOutFilter;
}
异常
java.lang.IllegalArgumentException: casServerUrlPrefix cannot be null.
at org.jasig.cas.client.util.CommonUtils.assertNotNull(CommonUtils.java:86)
at org.jasig.cas.client.session.SingleSignOutHandler.init(SingleSignOutHandler.java:140)
at org.jasig.cas.client.session.SingleSignOutFilter.init(SingleSignOutFilter.java:55)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:109)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4572)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5215)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
即使 casServerUrlPrefix
已设置并且它适用于旧版本。因此,我的问题是,这是否是升级 spring 安全性时常见的 bug/error,应该如何解决?
编辑:
我尝试进行较小的升级,它适用于 spring 启动 1.2.8.RELEASE
,但失败 1.3.0.RELEASE
。
我还尝试在升级 spring 引导时将 spring 安全版本更改得较低,但这没有帮助。
然后我创建了自己的 SingleSignOutFilter
来对 casServerUrlPrefix
进行硬编码,我摆脱了那个错误,我可以看到 casServerUrlPrefix
确实已设置。不幸的是,这并没有解决问题,我仍然无法使用我的网络应用程序,但现在它不会在日志中抛出异常。
所以我终于设法解决了这个问题。
在 SecurityConfiguration
class 中,必须从 SingleSignOutFilter
和 CasAuthenticationEntryPoint
中删除 @Bean
注释。这似乎是主要问题,很难找到。
此外,必须在 application.properties
中进行更改:
- 将
app.service.security
值从 ../j_spring_cas_security_check
替换为 ../login/cas
- 将
spring.view.prefix
替换为spring.mvc.view.prefix
- 也替换
suffix
`
就是这样。
根据 https://github.com/grails-plugins/grails-spring-security-cas/commit/347217482b16be85d775016d10b6b4ccc2f5825f ,如果您还将 属性 ignoreInitConfiguration
设置为 true
,那么它应该可以解决问题,或者至少对我有用。
<bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter">
<property name="casServerUrlPrefix" value="${cas.casServerUrlPrefix}"/>
<property name="ignoreInitConfiguration" value="true" />
</bean>
@Bean
open fun singleSignOutFilter(): SingleSignOutFilter {
val singleSignOutFilter = SingleSignOutFilter()
singleSignOutFilter.setIgnoreInitConfiguration(true)
singleSignOutFilter.setCasServerUrlPrefix(CAS_URL_PREFIX)
return singleSignOutFilter
}
我通过将 cas-client-core jar 升级到 3.6.1 解决了这个问题。希望这可以帮助面临这个问题的人。
我试图让 Spring 引导 + Spring 与 CAS 和 运行 的安全工作陷入一些麻烦。经过一段时间的研究,我发现了 good example project https://github.com/jgribonvald/demo-spring-security-cas 这非常好,我只需要将 CAS URL 更改为我的,它就开始完美地工作了。
它使用 spring boot 1.2.1.RELEASE,我想将它升级到最新版本 (1.5.2.RELEASE)。为了做到这一点,我不得不做一些修改(修复编译错误,因为一些 类 在新版本中被删除了)。
修复编译错误后,我用旧版本对其进行了测试,它仍然有效,但在最新版本中失败了。它抛出 casServerUrlPrefix
在 SingleSignOutFilter
@Bean
public SingleSignOutFilter singleSignOutFilter() {
SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
singleSignOutFilter.setCasServerUrlPrefix(env.getRequiredProperty(CAS_URL_PREFIX));
// singleSignOutFilter.setIgnoreInitConfiguration(true);
return singleSignOutFilter;
}
异常
java.lang.IllegalArgumentException: casServerUrlPrefix cannot be null.
at org.jasig.cas.client.util.CommonUtils.assertNotNull(CommonUtils.java:86)
at org.jasig.cas.client.session.SingleSignOutHandler.init(SingleSignOutHandler.java:140)
at org.jasig.cas.client.session.SingleSignOutFilter.init(SingleSignOutFilter.java:55)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:109)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4572)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5215)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
即使 casServerUrlPrefix
已设置并且它适用于旧版本。因此,我的问题是,这是否是升级 spring 安全性时常见的 bug/error,应该如何解决?
编辑:
我尝试进行较小的升级,它适用于 spring 启动 1.2.8.RELEASE
,但失败 1.3.0.RELEASE
。
我还尝试在升级 spring 引导时将 spring 安全版本更改得较低,但这没有帮助。
然后我创建了自己的 SingleSignOutFilter
来对 casServerUrlPrefix
进行硬编码,我摆脱了那个错误,我可以看到 casServerUrlPrefix
确实已设置。不幸的是,这并没有解决问题,我仍然无法使用我的网络应用程序,但现在它不会在日志中抛出异常。
所以我终于设法解决了这个问题。
在 SecurityConfiguration
class 中,必须从 SingleSignOutFilter
和 CasAuthenticationEntryPoint
中删除 @Bean
注释。这似乎是主要问题,很难找到。
此外,必须在 application.properties
中进行更改:
- 将
app.service.security
值从../j_spring_cas_security_check
替换为../login/cas
- 将
spring.view.prefix
替换为spring.mvc.view.prefix
- 也替换
suffix
`
就是这样。
根据 https://github.com/grails-plugins/grails-spring-security-cas/commit/347217482b16be85d775016d10b6b4ccc2f5825f ,如果您还将 属性 ignoreInitConfiguration
设置为 true
,那么它应该可以解决问题,或者至少对我有用。
<bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter">
<property name="casServerUrlPrefix" value="${cas.casServerUrlPrefix}"/>
<property name="ignoreInitConfiguration" value="true" />
</bean>
@Bean
open fun singleSignOutFilter(): SingleSignOutFilter {
val singleSignOutFilter = SingleSignOutFilter()
singleSignOutFilter.setIgnoreInitConfiguration(true)
singleSignOutFilter.setCasServerUrlPrefix(CAS_URL_PREFIX)
return singleSignOutFilter
}
我通过将 cas-client-core jar 升级到 3.6.1 解决了这个问题。希望这可以帮助面临这个问题的人。