Spring Boot安全升级会破坏CAS

时间:2017-03-30 12:51:50

标签: spring spring-boot spring-security cas spring-security-cas

我试图让Spring Boot + Spring Security与CAS合作并遇到一些麻烦。经过一段时间的研究,我找到了good example project https://github.com/jgribonvald/demo-spring-security-cas 这是非常好的,我只需要将CAS URL更改为我的,它开始完美地工作。

它使用spring boot 1.2.1.RELEASE,我想将其升级到最新版本(1.5.2.RELEASE)。为了做到这一点,我不得不做一些修改(修复编译错误,因为在较新的版本中删除了一些类)。

当修复编译错误时,我使用旧版本对其进行了测试,但仍然有效,但最新版本失败了。它会在SingleSignOutFilter

中抛出casServerUrlPrefix为空的错误
@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,它也适用于旧版本。因此,我的问题是,升级弹簧安全性时这是否是一些常见的错误/错误,应该如何修复它?

编辑:

我尝试进行较小的升级,但它适用于春季启动1.2.8.RELEASE,但失败了1.3.0.RELEASE。 我还尝试在升级弹簧启动时将弹簧安全版本降低,但这没有帮助。

然后我创建了自己的SingleSignOutFilter到硬编码casServerUrlPrefix,我摆脱了这个错误,我可以看到,casServerUrlPrefix确实已经确定。不幸的是,这并没有解决问题,我仍然无法使用我的网络应用程序,但现在它只是不会在日志中抛出异常。

4 个答案:

答案 0 :(得分:1)

所以我终于设法解决了这个问题。

SecurityConfiguration课程中,我必须从@BeanSingleSignOutFilter删除CasAuthenticationEntryPoint个注释。这似乎是主要问题,很难追查。

此外,必须在application.properties中进行更改:

  • app.service.security值从../j_spring_cas_security_check替换为../login/cas
  • spring.view.prefix替换为spring.mvc.view.prefix
  • 替换suffix以及

就是这样。

答案 1 :(得分:1)

根据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>

答案 2 :(得分:0)

    @Bean
    open fun singleSignOutFilter(): SingleSignOutFilter {
        val singleSignOutFilter = SingleSignOutFilter()
        singleSignOutFilter.setIgnoreInitConfiguration(true)
        singleSignOutFilter.setCasServerUrlPrefix(CAS_URL_PREFIX)
        return singleSignOutFilter
    }

答案 3 :(得分:0)

我通过将cas-client-core jar升级到3.6.1解决了这个问题。希望这可以帮助面临此问题的人。