diff --git a/config/src/main/java/org/springframework/security/config/http/AuthenticationConfigBuilder.java b/config/src/main/java/org/springframework/security/config/http/AuthenticationConfigBuilder.java index 0e432cee21..bbd74b6669 100644 --- a/config/src/main/java/org/springframework/security/config/http/AuthenticationConfigBuilder.java +++ b/config/src/main/java/org/springframework/security/config/http/AuthenticationConfigBuilder.java @@ -128,6 +128,9 @@ final class AuthenticationConfigBuilder { private final BeanReference portResolver; private final BeanMetadataElement csrfLogoutHandler; + private String loginProcessingUrl; + private String openidLoginProcessingUrl; + public AuthenticationConfigBuilder(Element element, ParserContext pc, SessionCreationPolicy sessionPolicy, BeanReference requestCache, BeanReference authenticationManager, BeanReference sessionStrategy, BeanReference portMapper, BeanReference portResolver, BeanMetadataElement csrfLogoutHandler) { this.httpElt = element; @@ -197,6 +200,7 @@ final class AuthenticationConfigBuilder { parser.parse(formLoginElt, pc); formFilter = parser.getFilterBean(); formEntryPoint = parser.getEntryPointBean(); + loginProcessingUrl = parser.getLoginProcessingUrl(); } if (formFilter != null) { @@ -221,6 +225,7 @@ final class AuthenticationConfigBuilder { parser.parse(openIDLoginElt, pc); openIDFilter = parser.getFilterBean(); openIDEntryPoint = parser.getEntryPointBean(); + openidLoginProcessingUrl = parser.getLoginProcessingUrl(); List attrExElts = DomUtils.getChildElementsByTagName(openIDLoginElt, Elements.OPENID_ATTRIBUTE_EXCHANGE); @@ -473,10 +478,12 @@ final class AuthenticationConfigBuilder { if (formFilterId != null) { loginPageFilter.addConstructorArgReference(formFilterId); + loginPageFilter.addPropertyValue("authenticationUrl", loginProcessingUrl); } if (openIDFilterId != null) { loginPageFilter.addConstructorArgReference(openIDFilterId); + loginPageFilter.addPropertyValue("openIDauthenticationUrl", openidLoginProcessingUrl); } loginPageGenerationFilter = loginPageFilter.getBeanDefinition(); diff --git a/config/src/main/java/org/springframework/security/config/http/FormLoginBeanDefinitionParser.java b/config/src/main/java/org/springframework/security/config/http/FormLoginBeanDefinitionParser.java index a15b48b66c..216f79a207 100644 --- a/config/src/main/java/org/springframework/security/config/http/FormLoginBeanDefinitionParser.java +++ b/config/src/main/java/org/springframework/security/config/http/FormLoginBeanDefinitionParser.java @@ -66,6 +66,7 @@ public class FormLoginBeanDefinitionParser { private RootBeanDefinition filterBean; private RootBeanDefinition entryPointBean; private String loginPage; + private String loginProcessingUrl; FormLoginBeanDefinitionParser(String defaultLoginProcessingUrl, String filterClassName, BeanReference requestCache, BeanReference sessionStrategy, boolean allowSessionCreation, BeanReference portMapper, BeanReference portResolver) { @@ -148,6 +149,8 @@ public class FormLoginBeanDefinitionParser { loginUrl = defaultLoginProcessingUrl; } + this.loginProcessingUrl = loginUrl; + BeanDefinitionBuilder matcherBuilder = BeanDefinitionBuilder.rootBeanDefinition("org.springframework.security.web.authentication.logout.LogoutFilter$FilterProcessUrlRequestMatcher"); matcherBuilder.addConstructorArgValue(loginUrl); @@ -204,4 +207,8 @@ public class FormLoginBeanDefinitionParser { String getLoginPage() { return loginPage; } + + String getLoginProcessingUrl() { + return loginProcessingUrl; + } } diff --git a/config/src/test/groovy/org/springframework/security/config/http/FormLoginBeanDefinitionParserTests.groovy b/config/src/test/groovy/org/springframework/security/config/http/FormLoginBeanDefinitionParserTests.groovy new file mode 100644 index 0000000000..e51d8d5ab9 --- /dev/null +++ b/config/src/test/groovy/org/springframework/security/config/http/FormLoginBeanDefinitionParserTests.groovy @@ -0,0 +1,109 @@ +package org.springframework.security.config.http + +import org.springframework.mock.web.MockFilterChain +import org.springframework.mock.web.MockHttpServletRequest +import org.springframework.mock.web.MockHttpServletResponse + +/** + * + * @author Luke Taylor + */ +class FormLoginBeanDefinitionParserTests extends AbstractHttpConfigTests { + + def 'form-login default login page'() { + setup: + MockHttpServletRequest request = new MockHttpServletRequest(method:'GET',requestURI:'/spring_security_login') + MockHttpServletResponse response = new MockHttpServletResponse() + MockFilterChain chain = new MockFilterChain() + httpAutoConfig { + } + createAppContext() + when: + springSecurityFilterChain.doFilter(request,response,chain) + then: + response.getContentAsString() == """Login Page +

Login with Username and Password

+ + + + +
User:
Password:
+
""" + } + + def 'form-login default login page custom attributes'() { + setup: + MockHttpServletRequest request = new MockHttpServletRequest(method:'GET',requestURI:'/spring_security_login') + MockHttpServletResponse response = new MockHttpServletResponse() + MockFilterChain chain = new MockFilterChain() + httpAutoConfig { + 'form-login'('login-processing-url':'/login_custom','username-parameter':'custom_user','password-parameter':'custom_password') + } + createAppContext() + when: + springSecurityFilterChain.doFilter(request,response,chain) + then: + response.getContentAsString() == """Login Page +

Login with Username and Password

+ + + + +
User:
Password:
+
""" + } + + def 'openid-login default login page'() { + setup: + MockHttpServletRequest request = new MockHttpServletRequest(method:'GET',requestURI:'/spring_security_login') + MockHttpServletResponse response = new MockHttpServletResponse() + MockFilterChain chain = new MockFilterChain() + httpAutoConfig { + 'openid-login'() + } + createAppContext() + when: + springSecurityFilterChain.doFilter(request,response,chain) + then: + response.getContentAsString() == """Login Page +

Login with Username and Password

+ + + + +
User:
Password:
+

Login with OpenID Identity

+ + + +
Identity:
+
""" + } + + def 'openid-login default login page custom attributes'() { + setup: + MockHttpServletRequest request = new MockHttpServletRequest(method:'GET',requestURI:'/spring_security_login') + MockHttpServletResponse response = new MockHttpServletResponse() + MockFilterChain chain = new MockFilterChain() + httpAutoConfig { + 'openid-login'('login-processing-url':'/login_custom') + } + createAppContext() + when: + springSecurityFilterChain.doFilter(request,response,chain) + then: + response.getContentAsString() == """Login Page +

Login with Username and Password

+ + + + +
User:
Password:
+

Login with OpenID Identity

+ + + +
Identity:
+
""" + } +}