I am trying to integrate the Spring Saml library into a sample web application using Shibboleth as an IDP. I can load the login page, log in and show the index page.
The problem is that when I click on other links, webapp redirects me to the login page, then IDP recognizes me and redirects to the requested page (if itβs very difficult to see on the network). This is similar to the fact that I did not log into the system for Spring security.
I checked the log and I found this:
org.springframework.security.web.context.HttpSessionSecurityContextRepository - HttpSession returned a null object for SPRING_SECURITY_CONTEXT org.springframework.security.web.context.HttpSessionSecurityContextRepository - No new SecurityContext will be created from EmailContext.
This is web.xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring/root-context.xml /WEB-INF/spring/security/securityContext.xml </param-value> </context-param> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <error-page> <error-code>400</error-code> <location>/errors/missing-en.html</location> </error-page> <error-page> <error-code>401</error-code> <location>/errors/restricted-en.html</location> </error-page> <error-page> <error-code>403</error-code> <location>/errors/restricted-en.html</location> </error-page> <error-page> <error-code>404</error-code> <location>/errors/missing-en.html</location> </error-page> <error-page> <error-code>500</error-code> <location>/errors/missing-en.html</location> </error-page> <error-page> <error-code>503</error-code> <location>/errors/missing-en.html</location> </error-page>
and securityContext
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <context:component-scan base-package="org.springframework.security.saml" /> <security:http pattern="/logout.jsp" security="none" /> <security:http pattern="/login.jsp" security="none" /> <security:http pattern="/index.html" security="none" /> <security:http entry-point-ref="samlEntryPoint"> <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" /> <security:custom-filter before="FIRST" ref="metadataGeneratorFilter" /> <security:custom-filter after="BASIC_AUTH_FILTER" ref="samlFilter" /> </security:http> <bean id="samlFilter" class="org.springframework.security.web.FilterChainProxy"> <security:filter-chain-map path-type="ant"> <security:filter-chain pattern="/saml/login/**" filters="samlEntryPoint" /> <security:filter-chain pattern="/saml/logout/**" filters="samlLogoutFilter" /> <security:filter-chain pattern="/saml/SSO/**" filters="samlWebSSOProcessingFilter" /> <security:filter-chain pattern="/saml/SSOHoK/**" filters="samlWebSSOHoKProcessingFilter" /> <security:filter-chain pattern="/saml/SingleLogout/**" filters="samlLogoutProcessingFilter" /> </security:filter-chain-map> </bean> <bean id="successRedirectHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler"> <property name="defaultTargetUrl" value="/" /> </bean> <bean id="successLogoutHandler" class="org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler"> <property name="defaultTargetUrl" value="/logout.jsp" /> </bean> <security:authentication-manager alias="authenticationManager"> <security:authentication-provider ref="samlAuthenticationProvider" /> </security:authentication-manager> <bean id="samlLogger" class="org.springframework.security.saml.log.SAMLDefaultLogger" /> <bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager"> <constructor-arg value="/WEB-INF/spring/security/myKeystore.jks" /> <constructor-arg type="java.lang.String" value="betfair" /> <constructor-arg> <map> <entry key="tomcat" value="betfair" /> </map> </constructor-arg> <constructor-arg type="java.lang.String" value="tomcat" /> </bean> <bean id="samlEntryPoint" class="org.springframework.security.saml.SAMLEntryPoint"> <property name="defaultProfileOptions"> <bean class="org.springframework.security.saml.websso.WebSSOProfileOptions"> <property name="includeScoping" value="false" /> </bean> </property> </bean> <bean id="samlIDPDiscovery" class="org.springframework.security.saml.SAMLDiscovery"> <property name="idpSelectionPath" value="/WEB-INF/security/idpSelection.jsp" /> </bean> <bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter"> <constructor-arg> <bean class="org.springframework.security.saml.metadata.MetadataGenerator" /> </constructor-arg> </bean> <bean id="metadataDisplayFilter" class="org.springframework.security.saml.metadata.MetadataDisplayFilter" /> <bean id="metadata" class="org.springframework.security.saml.metadata.CachingMetadataManager"> <constructor-arg> <list> <bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate"> <constructor-arg> <bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider"> <constructor-arg> <value type="java.io.File">/WEB-INF/spring/security/shibboleth.xml</value> </constructor-arg> <property name="parserPool" ref="parserPool" /> </bean> </constructor-arg> <constructor-arg> <bean class="org.springframework.security.saml.metadata.ExtendedMetadata"> </bean> </constructor-arg> </bean> <bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate"> <constructor-arg> <bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider"> <constructor-arg> <value type="java.io.File">/WEB-INF/spring/security/localhost_sp.xml</value> </constructor-arg> <property name="parserPool" ref="parserPool" /> </bean> </constructor-arg> <constructor-arg> <bean class="org.springframework.security.saml.metadata.ExtendedMetadata"> <property name="local" value="true" /> <property name="alias" value="localhost" /> <property name="securityProfile" value="metaiop" /> <property name="sslSecurityProfile" value="pkix" /> <property name="signingKey" value="tomcat" /> <property name="encryptionKey" value="tomcat" /> <property name="tlsKey" value="tomcat" /> <property name="requireArtifactResolveSigned" value="false" /> <property name="requireLogoutRequestSigned" value="false" /> <property name="requireLogoutResponseSigned" value="false" /> </bean> </constructor-arg> </bean> </list> </constructor-arg> <property name="hostedSPName" value="localhost"/> </bean> <bean id="samlAuthenticationProvider" class="org.springframework.security.saml.SAMLAuthenticationProvider"> </bean> <bean id="contextProvider" class="org.springframework.security.saml.context.SAMLContextProviderImpl" /> <bean id="samlWebSSOProcessingFilter" class="org.springframework.security.saml.SAMLProcessingFilter"> <property name="authenticationManager" ref="authenticationManager" /> <property name="authenticationSuccessHandler" ref="successRedirectHandler" /> </bean> <bean id="samlWebSSOHoKProcessingFilter" class="org.springframework.security.saml.SAMLWebSSOHoKProcessingFilter"> <property name="authenticationManager" ref="authenticationManager" /> <property name="authenticationSuccessHandler" ref="successRedirectHandler" /> </bean> <bean id="logoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"> <property name="invalidateHttpSession" value="false" /> </bean> <bean id="samlLogoutFilter" class="org.springframework.security.saml.SAMLLogoutFilter"> <constructor-arg ref="successLogoutHandler" /> <constructor-arg ref="logoutHandler" /> <constructor-arg ref="logoutHandler" /> </bean> <bean id="samlLogoutProcessingFilter" class="org.springframework.security.saml.SAMLLogoutProcessingFilter"> <constructor-arg ref="successLogoutHandler" /> <constructor-arg ref="logoutHandler" /> </bean> <bean id="processor" class="org.springframework.security.saml.processor.SAMLProcessorImpl"> <constructor-arg> <list> <ref bean="redirectBinding" /> <ref bean="postBinding" /> <ref bean="artifactBinding" /> <ref bean="soapBinding" /> <ref bean="paosBinding" /> </list> </constructor-arg> </bean> <bean id="webSSOprofileConsumer" class="org.springframework.security.saml.websso.WebSSOProfileConsumerImpl" /> <bean id="hokWebSSOprofileConsumer" class="org.springframework.security.saml.websso.WebSSOProfileConsumerHoKImpl" /> <bean id="webSSOprofile" class="org.springframework.security.saml.websso.WebSSOProfileImpl" /> <bean id="hokWebSSOProfile" class="org.springframework.security.saml.websso.WebSSOProfileConsumerHoKImpl" /> <bean id="ecpprofile" class="org.springframework.security.saml.websso.WebSSOProfileECPImpl" /> <bean id="logoutprofile" class="org.springframework.security.saml.websso.SingleLogoutProfileImpl" /> <bean id="postBinding" class="org.springframework.security.saml.processor.HTTPPostBinding"> <constructor-arg ref="parserPool" /> <constructor-arg ref="velocityEngine" /> </bean> <bean id="redirectBinding" class="org.springframework.security.saml.processor.HTTPRedirectDeflateBinding"> <constructor-arg ref="parserPool" /> </bean> <bean id="artifactBinding" class="org.springframework.security.saml.processor.HTTPArtifactBinding"> <constructor-arg ref="parserPool" /> <constructor-arg ref="velocityEngine" /> <constructor-arg> <bean class="org.springframework.security.saml.websso.ArtifactResolutionProfileImpl"> <constructor-arg> <bean class="org.apache.commons.httpclient.HttpClient" /> </constructor-arg> <property name="processor"> <bean id="soapProcessor" class="org.springframework.security.saml.processor.SAMLProcessorImpl"> <constructor-arg ref="soapBinding" /> </bean> </property> </bean> </constructor-arg> </bean> <bean id="soapBinding" class="org.springframework.security.saml.processor.HTTPSOAP11Binding"> <constructor-arg ref="parserPool" /> </bean> <bean id="paosBinding" class="org.springframework.security.saml.processor.HTTPPAOS11Binding"> <constructor-arg ref="parserPool" /> </bean> <bean class="org.springframework.security.saml.SAMLBootstrap" /> <bean id="velocityEngine" class="org.springframework.security.saml.util.VelocityFactory" factory-method="getEngine" /> <bean id="parserPool" class="org.opensaml.xml.parse.BasicParserPool" scope="singleton" />
Any idea?
Thanks emanuele
source share