Intenté que Spring Boot + Spring Security funcionara con CAS y tuve algunos problemas. Después de un tiempo investigando encontré un buen proyecto de ejemplo https://github.com/jgribonvald/demo-spring-security-cas Es muy bueno, solo tuve que cambiar las URL de CAS a las mías y comenzó a funcionar perfectamente.
Utiliza Spring Boot 1.2.1.RELEASE y quería actualizarlo a la última versión (1.5.2.RELEASE). Para hacer eso, tuve que hacer algunas modificaciones (corregir errores de compilación, porque algunas clases se eliminaron en versiones más nuevas).
Cuando se corrigieron los errores de compilación, lo probé con una versión anterior y aún funcionaba, pero falló con la última versión. Lanza un error de que casServerUrlPrefix es nulo en SingleSignOutFilter
@Bean public SingleSignOutFilter singleSignOutFilter() { SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter(); singleSignOutFilter.setCasServerUrlPrefix(env.getRequiredProperty(CAS_URL_PREFIX)); // singleSignOutFilter.setIgnoreInitConfiguration(true); return singleSignOutFilter; }Excepción
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) Aunque casServerUrlPrefix está configurado y funciona con una versión anterior. Por lo tanto, mi pregunta es si se trata de un error común al actualizar la seguridad de Spring y cómo se debe solucionar.
EDITAR:
Intenté hacer actualizaciones más pequeñas y funciona con Spring Boot 1.2.8.RELEASE , pero falla con 1.3.0.RELEASE . También traté de cambiar la versión de seguridad de primavera más baja mientras actualizaba el arranque de primavera, pero eso no ayudó.
Luego creo mi propio SingleSignOutFilter para codificar casServerUrlPrefix y eliminé ese error y pude ver que casServerUrlPrefix estaba realmente configurado. Desafortunadamente, eso no solucionó el problema, todavía no puedo usar mi aplicación web, pero ahora simplemente no arroja excepciones en el registro.
Así que finalmente logré resolver este problema.
En la clase SecurityConfiguration , se deben eliminar las anotaciones @Bean de SingleSignOutFilter y CasAuthenticationEntryPoint . Este parecía ser el problema principal y era bastante difícil de rastrear.
Además, uno debe hacer cambios en application.properties :
app.service.security de ../j_spring_cas_security_check a ../login/casspring.view.prefix con spring.mvc.view.prefixsuffix también`Eso es todo.
Según https://github.com/grails-plugins/grails-spring-security-cas/commit/347217482b16be85d775016d10b6b4ccc2f5825f , si también establece la propiedad ignoreInitConfiguration en true , entonces debería solucionar el problema, o al menos lo hizo para mí.
<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 }