2
0
Эх сурвалжийг харах

Refactor strings to static fields. To facilitate unit testing, package
protected visibility was adopted for all element names, attribute names,
and attribute default values. A public access modifier was used for all
bean IDs assigned to bean definitions created by the
BeanDefinitionParsers.

Ben Alex 18 жил өмнө
parent
commit
d9ec944579
21 өөрчлөгдсөн 227 нэмэгдсэн , 179 устгасан
  1. 10 10
      core/src/main/java/org/springframework/security/config/AnonymousBeanDefinitionParser.java
  2. 8 7
      core/src/main/java/org/springframework/security/config/BasicAuthenticationBeanDefinitionParser.java
  3. 29 2
      core/src/main/java/org/springframework/security/config/BeanIds.java
  4. 5 9
      core/src/main/java/org/springframework/security/config/ConcurrentSessionsBeanDefinitionParser.java
  5. 6 8
      core/src/main/java/org/springframework/security/config/ConfigUtils.java
  6. 17 3
      core/src/main/java/org/springframework/security/config/Elements.java
  7. 7 9
      core/src/main/java/org/springframework/security/config/FilterChainMapBeanDefinitionDecorator.java
  8. 26 22
      core/src/main/java/org/springframework/security/config/FormLoginBeanDefinitionParser.java
  9. 25 42
      core/src/main/java/org/springframework/security/config/HttpSecurityBeanDefinitionParser.java
  10. 6 6
      core/src/main/java/org/springframework/security/config/HttpSecurityConfigPostProcessor.java
  11. 12 9
      core/src/main/java/org/springframework/security/config/InterceptMethodsBeanDefinitionDecorator.java
  12. 10 7
      core/src/main/java/org/springframework/security/config/LogoutBeanDefinitionParser.java
  13. 16 15
      core/src/main/java/org/springframework/security/config/RememberMeBeanDefinitionParser.java
  14. 7 7
      core/src/main/java/org/springframework/security/config/RepositoryBeanDefinitionParser.java
  15. 8 7
      core/src/main/java/org/springframework/security/config/SecurityNamespaceHandler.java
  16. 11 8
      core/src/main/java/org/springframework/security/config/UserServiceBeanDefinitionParser.java
  17. 8 2
      core/src/main/resources/org/springframework/security/config/spring-security-2.0.rnc
  18. 12 2
      core/src/main/resources/org/springframework/security/config/spring-security-2.0.xsd
  19. 1 1
      core/src/test/java/org/springframework/security/config/CustomUserDetailsTests.java
  20. 2 2
      core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java
  21. 1 1
      core/src/test/java/org/springframework/security/config/JdbcUserDetailsTests.java

+ 10 - 10
core/src/main/java/org/springframework/security/config/AnonymousBeanDefinitionParser.java

@@ -16,29 +16,29 @@ import org.w3c.dom.Element;
  * @version $Id: RememberMeBeanDefinitionParser.java 2231 2007-11-07 13:29:15Z luke_t $
  */
 public class AnonymousBeanDefinitionParser implements BeanDefinitionParser {
-    protected final Log logger = LogFactory.getLog(getClass());
-
-    public static final String DEFAULT_ANONYMOUS_FILTER_ID = "_anonymousProcessingFilter";
-    public static final String DEFAULT_ANONYMOUS_AUTHENTICATION_PROVIDER_ID = "_anonymousAuthenticationProvider";
+    static final String ATT_KEY = "key";
+	static final String ATT_USERNAME = "username";
+	static final String ATT_GRANTED_AUTHORITY = "grantedAuthority";
+	protected final Log logger = LogFactory.getLog(getClass());
 
     public BeanDefinition parse(Element element, ParserContext parserContext) {
         BeanDefinition filter = new RootBeanDefinition(AnonymousProcessingFilter.class);
 
-        String grantedAuthority = element.getAttribute("grantedAuthority");
-        String username         = element.getAttribute("username");
-        String key              = element.getAttribute("key");
+        String grantedAuthority = element.getAttribute(ATT_GRANTED_AUTHORITY);
+        String username         = element.getAttribute(ATT_USERNAME);
+        String key              = element.getAttribute(ATT_KEY);
 
         filter.getPropertyValues().addPropertyValue("userAttribute", username + "," + grantedAuthority);
-        filter.getPropertyValues().addPropertyValue("key", key);
+        filter.getPropertyValues().addPropertyValue(ATT_KEY, key);
 
         BeanDefinition authManager = ConfigUtils.registerProviderManagerIfNecessary(parserContext);
         BeanDefinition provider = new RootBeanDefinition(AnonymousAuthenticationProvider.class);
-        provider.getPropertyValues().addPropertyValue("key", key);
+        provider.getPropertyValues().addPropertyValue(ATT_KEY, key);
 
         ManagedList authMgrProviderList = (ManagedList) authManager.getPropertyValues().getPropertyValue("providers").getValue();
         authMgrProviderList.add(provider);
 
-        parserContext.getRegistry().registerBeanDefinition(DEFAULT_ANONYMOUS_FILTER_ID, filter);
+        parserContext.getRegistry().registerBeanDefinition(BeanIds.ANONYMOUS_PROCESSING_FILTER, filter);
 
         return null;
     }

+ 8 - 7
core/src/main/java/org/springframework/security/config/BasicAuthenticationBeanDefinitionParser.java

@@ -14,29 +14,30 @@ import org.w3c.dom.Element;
  * registers them in the application context.
  *
  * @author Luke Taylor
+ * @author Ben Alex
  * @version $Id$
  */
 public class BasicAuthenticationBeanDefinitionParser implements BeanDefinitionParser {
-    public static final String DEFAULT_BASIC_AUTH_FILTER_ID = "_basicAuthenticationFilter";
-    public static final String DEFAULT_BASIC_AUTH_ENTRY_POINT_ID = "_basicAuthenticationEntryPoint";
+    static final String ATT_REALM = "realm";
 
-
-    public BeanDefinition parse(Element elt, ParserContext parserContext) {
+	public BeanDefinition parse(Element elt, ParserContext parserContext) {
         BeanDefinitionBuilder filterBuilder =
                 BeanDefinitionBuilder.rootBeanDefinition(BasicProcessingFilter.class);
         RootBeanDefinition entryPoint = new RootBeanDefinition(BasicProcessingFilterEntryPoint.class);
 
-        String realm = elt.getAttribute("realm");
+        String realm = elt.getAttribute(ATT_REALM);
 
         entryPoint.getPropertyValues().addPropertyValue("realmName", realm);
 
         filterBuilder.addPropertyValue("authenticationEntryPoint", entryPoint);
+        
+        // TODO: Remove autowiring approach from here.
         // Detect auth manager
         filterBuilder.setAutowireMode(RootBeanDefinition.AUTOWIRE_BY_TYPE);
 
-        parserContext.getRegistry().registerBeanDefinition(DEFAULT_BASIC_AUTH_FILTER_ID,
+        parserContext.getRegistry().registerBeanDefinition(BeanIds.BASIC_AUTHENTICATION_FILTER,
                 filterBuilder.getBeanDefinition());
-        parserContext.getRegistry().registerBeanDefinition(DEFAULT_BASIC_AUTH_ENTRY_POINT_ID, entryPoint);
+        parserContext.getRegistry().registerBeanDefinition(BeanIds.BASIC_AUTHENTICATION_ENTRY_POINT, entryPoint);
 
         return null;
     }

+ 29 - 2
core/src/main/java/org/springframework/security/config/BeanIds.java

@@ -6,8 +6,35 @@ package org.springframework.security.config;
  * @author Ben Alex
  * @version $Id$
  */
-class BeanIds {
+public class BeanIds {
 
-	static final String JDBC_USER_DETAILS_MANAGER = "_jdbcUserDetailsManager";
+	/** Package protected as end users shouldn't really be using this BFPP directly */
+	static final String INTERCEPT_METHODS_BEAN_FACTORY_POST_PROCESSOR = "_interceptMethodsBeanfactoryPP";
 
+	public static final String JDBC_USER_DETAILS_MANAGER = "_jdbcUserDetailsManager";
+	public static final String USER_DETAILS_SERVICE = "_userDetailsService";
+	public static final String ANONYMOUS_PROCESSING_FILTER = "_anonymousProcessingFilter";
+	public static final String ANONYMOUS_AUTHENTICATION_PROVIDER = "_anonymousAuthenticationProvider";
+	public static final String BASIC_AUTHENTICATION_FILTER = "_basicAuthenticationFilter";
+	public static final String BASIC_AUTHENTICATION_ENTRY_POINT = "_basicAuthenticationEntryPoint";
+	public static final String SESSION_REGISTRY = "_sessionRegistry";
+	public static final String CONCURRENT_SESSION_FILTER = "_concurrentSessionFilter";
+	public static final String CONCURRENT_SESSION_CONTROLLER = "_concurrentSessionController";
+	public static final String ACCESS_MANAGER = "_accessManager";
+	public static final String AUTHENTICATION_MANAGER = "_authenticationManager";
+	public static final String FORM_LOGIN_FILTER = "_formLoginFilter";
+	public static final String FORM_LOGIN_ENTRY_POINT = "_formLoginEntryPoint";
+	public static final String FILTER_CHAIN_PROXY = "_filterChainProxy";
+	public static final String HTTP_SESSION_CONTEXT_INTEGRATION_FILTER = "_httpSessionContextIntegrationFilter";
+	public static final String LOGOUT_FILTER = "_logoutFilter";
+	public static final String EXCEPTION_TRANSLATION_FILTER = "_exceptionTranslationFilter";
+	public static final String FILTER_SECURITY_INTERCEPTOR = "_filterSecurityInterceptor";
+	public static final String CHANNEL_PROCESSING_FILTER = "_channelProcessingFilter";
+	public static final String CHANNEL_DECISION_MANAGER = "_channelDecisionManager";
+	public static final String REMEMBER_ME_FILTER = "_rememberMeFilter";
+	public static final String REMEMBER_ME_SERVICES = "_rememberMeServices";
+	public static final String DEFAULT_LOGIN_PAGE_GENERATING_FILTER = "_defaultLoginPageFilter";
+
+	
+	
 }

+ 5 - 9
core/src/main/java/org/springframework/security/config/ConcurrentSessionsBeanDefinitionParser.java

@@ -23,10 +23,6 @@ import org.w3c.dom.Element;
  * @version $Id$
  */
 public class ConcurrentSessionsBeanDefinitionParser implements BeanDefinitionParser {
-    static final String DEFAULT_SESSION_REGISTRY_ID = "_sessionRegistry";
-    static final String DEFAULT_CONCURRENT_SESSION_FILTER_ID = "_concurrentSessionFilter";
-    static final String DEFAULT_SESSION_CONTROLLER_ID = "_concurrentSessionController";
-
     public BeanDefinition parse(Element element, ParserContext parserContext) {
         BeanDefinitionRegistry beanRegistry = parserContext.getRegistry();
 
@@ -35,8 +31,8 @@ public class ConcurrentSessionsBeanDefinitionParser implements BeanDefinitionPar
                 BeanDefinitionBuilder.rootBeanDefinition(ConcurrentSessionFilter.class);
         BeanDefinitionBuilder controllerBuilder
                 = BeanDefinitionBuilder.rootBeanDefinition(ConcurrentSessionControllerImpl.class);
-        controllerBuilder.addPropertyValue("sessionRegistry", new RuntimeBeanReference(DEFAULT_SESSION_REGISTRY_ID));
-        filterBuilder.addPropertyValue("sessionRegistry", new RuntimeBeanReference(DEFAULT_SESSION_REGISTRY_ID));
+        controllerBuilder.addPropertyValue("sessionRegistry", new RuntimeBeanReference(BeanIds.SESSION_REGISTRY));
+        filterBuilder.addPropertyValue("sessionRegistry", new RuntimeBeanReference(BeanIds.SESSION_REGISTRY));
 
         String expiryUrl = element.getAttribute("expiryUrl");
 
@@ -57,9 +53,9 @@ public class ConcurrentSessionsBeanDefinitionParser implements BeanDefinitionPar
         }
 
         BeanDefinition controller = controllerBuilder.getBeanDefinition();
-        beanRegistry.registerBeanDefinition(DEFAULT_SESSION_REGISTRY_ID, sessionRegistry);
-        beanRegistry.registerBeanDefinition(DEFAULT_SESSION_CONTROLLER_ID, controller);
-        beanRegistry.registerBeanDefinition(DEFAULT_CONCURRENT_SESSION_FILTER_ID, filterBuilder.getBeanDefinition());
+        beanRegistry.registerBeanDefinition(BeanIds.SESSION_REGISTRY, sessionRegistry);
+        beanRegistry.registerBeanDefinition(BeanIds.CONCURRENT_SESSION_CONTROLLER, controller);
+        beanRegistry.registerBeanDefinition(BeanIds.CONCURRENT_SESSION_FILTER, filterBuilder.getBeanDefinition());
 
         BeanDefinition providerManager = ConfigUtils.registerProviderManagerIfNecessary(parserContext);
 

+ 6 - 8
core/src/main/java/org/springframework/security/config/ConfigUtils.java

@@ -23,12 +23,10 @@ import java.util.Map;
  * Utitily methods used internally by the Spring Security namespace configuration code.
  *
  * @author Luke Taylor
+ * @author Ben Alex
  * @version $Id$
  */
 public abstract class ConfigUtils {
-    public static final String DEFAULT_ACCESS_MANAGER_ID = "_accessManager";
-    public static final String DEFAULT_AUTH_MANAGER_ID = "_authenticationManager";
-
     static void registerAccessManagerIfNecessary(ConfigurableListableBeanFactory bf) {
         if (bf.getBeanNamesForType(AccessDecisionManager.class).length > 0) {
             return;
@@ -39,13 +37,13 @@ public abstract class ConfigUtils {
 
         BeanDefinitionRegistry registry = (BeanDefinitionRegistry)bf;
 
-        if (!registry.containsBeanDefinition(DEFAULT_ACCESS_MANAGER_ID)) {
+        if (!registry.containsBeanDefinition(BeanIds.ACCESS_MANAGER)) {
             BeanDefinitionBuilder accessMgrBuilder = BeanDefinitionBuilder.rootBeanDefinition(AffirmativeBased.class);
             accessMgrBuilder.addPropertyValue("decisionVoters",
                             Arrays.asList(new Object[] {new RoleVoter(), new AuthenticatedVoter()}));
             BeanDefinition accessMgr = accessMgrBuilder.getBeanDefinition();
 
-            registry.registerBeanDefinition(DEFAULT_ACCESS_MANAGER_ID, accessMgr);
+            registry.registerBeanDefinition(BeanIds.ACCESS_MANAGER, accessMgr);
         }
     }
 
@@ -56,13 +54,13 @@ public abstract class ConfigUtils {
      * authentication manager.
      */
     static BeanDefinition registerProviderManagerIfNecessary(ParserContext parserContext) {
-        if(parserContext.getRegistry().containsBeanDefinition(DEFAULT_AUTH_MANAGER_ID)) {
-            return parserContext.getRegistry().getBeanDefinition(DEFAULT_AUTH_MANAGER_ID);
+        if(parserContext.getRegistry().containsBeanDefinition(BeanIds.AUTHENTICATION_MANAGER)) {
+            return parserContext.getRegistry().getBeanDefinition(BeanIds.AUTHENTICATION_MANAGER);
         }
 
         BeanDefinition authManager = new RootBeanDefinition(ProviderManager.class);
         authManager.getPropertyValues().addPropertyValue("providers", new ManagedList());
-        parserContext.getRegistry().registerBeanDefinition(DEFAULT_AUTH_MANAGER_ID, authManager);
+        parserContext.getRegistry().registerBeanDefinition(BeanIds.AUTHENTICATION_MANAGER, authManager);
 
         return authManager;
     }

+ 17 - 3
core/src/main/java/org/springframework/security/config/Elements.java

@@ -8,8 +8,22 @@ package org.springframework.security.config;
  */
 class Elements {
 
-	static final String ELT_USER_SERVICE = "user-service";
-	static final String ELT_JDBC_USER_SERVICE = "jdbc-user-service";
-	static final String ELT_CUSTOM_USER_SERVICE = "custom-user-service";
+	public static final String USER_SERVICE = "user-service";
+	public static final String JDBC_USER_SERVICE = "jdbc-user-service";
+	public static final String CUSTOM_USER_SERVICE = "custom-user-service";
+	public static final String FILTER_CHAIN_MAP = "filter-chain-map";
+	public static final String INTERCEPT_METHODS = "intercept-methods";
+	public static final String AUTHENTICATION_PROVIDER = "authentication-provider";
+	public static final String REPOSITORY = "repository";
+	public static final String HTTP = "http";
+	public static final String LDAP = "ldap";
+	public static final String PROTECT = "protect";
+	public static final String CONCURRENT_SESSIONS = "concurrent-session-control";
+	public static final String LOGOUT = "logout";
+	public static final String FORM_LOGIN = "form-login";
+	public static final String BASIC_AUTH = "http-basic";
+	public static final String REMEMBER_ME = "remember-me";
+	public static final String ANONYMOUS = "anonymous";
+	public static final String FILTER_CHAIN = "filter-chain";
 
 }

+ 7 - 9
core/src/main/java/org/springframework/security/config/FilterChainMapBeanDefinitionDecorator.java

@@ -23,29 +23,27 @@ import java.util.*;
  * @version $Id$
  */
 class FilterChainMapBeanDefinitionDecorator implements BeanDefinitionDecorator {
-    public static final String FILTER_CHAIN_ELT_NAME = "filter-chain";
-
     public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder holder, ParserContext parserContext) {
         BeanDefinition filterChainProxy = holder.getBeanDefinition();
 
         Map filterChainMap = new LinkedHashMap();
         Element elt = (Element)node;
 
-        String pathType = elt.getAttribute(HttpSecurityBeanDefinitionParser.PATTERN_TYPE_ATTRIBUTE);
+        String pathType = elt.getAttribute(HttpSecurityBeanDefinitionParser.ATT_PATTERN_TYPE);
 
-        if (HttpSecurityBeanDefinitionParser.PATTERN_TYPE_REGEX.equals(pathType)) {
+        if (HttpSecurityBeanDefinitionParser.ATT_PATTERN_TYPE_REGEX.equals(pathType)) {
             filterChainProxy.getPropertyValues().addPropertyValue("matcher", new RegexUrlPathMatcher());
         }
 
-        Iterator filterChainElts = DomUtils.getChildElementsByTagName(elt, FILTER_CHAIN_ELT_NAME).iterator();
+        Iterator filterChainElts = DomUtils.getChildElementsByTagName(elt, Elements.FILTER_CHAIN).iterator();
 
         while (filterChainElts.hasNext()) {
             Element chain = (Element) filterChainElts.next();
-            String path = chain.getAttribute(HttpSecurityBeanDefinitionParser.PATH_PATTERN_ATTRIBUTE);
-            Assert.hasText(path, "The attribute '" + HttpSecurityBeanDefinitionParser.PATH_PATTERN_ATTRIBUTE +
+            String path = chain.getAttribute(HttpSecurityBeanDefinitionParser.ATT_PATH_PATTERN);
+            Assert.hasText(path, "The attribute '" + HttpSecurityBeanDefinitionParser.ATT_PATH_PATTERN +
                     "' must not be empty");
-            String filters = chain.getAttribute(HttpSecurityBeanDefinitionParser.FILTERS_ATTRIBUTE);
-            Assert.hasText(filters, "The attribute '" + HttpSecurityBeanDefinitionParser.FILTERS_ATTRIBUTE +
+            String filters = chain.getAttribute(HttpSecurityBeanDefinitionParser.ATT_FILTERS);
+            Assert.hasText(filters, "The attribute '" + HttpSecurityBeanDefinitionParser.ATT_FILTERS +
                     "'must not be empty");
 
             if (filters.equals(HttpSecurityBeanDefinitionParser.NO_FILTERS_VALUE)) {

+ 26 - 22
core/src/main/java/org/springframework/security/config/FormLoginBeanDefinitionParser.java

@@ -17,21 +17,23 @@ import org.apache.commons.logging.LogFactory;
 
 /**
  * @author Luke Taylor
+ * @author Ben Alex
  * @version $Id$
  */
 public class FormLoginBeanDefinitionParser implements BeanDefinitionParser {
     protected final Log logger = LogFactory.getLog(getClass());
 
-    public static final String DEFAULT_FORM_LOGIN_FILTER_ID = "_formLoginFilter";
-    public static final String DEFAULT_FORM_LOGIN_ENTRY_POINT_ID = "_formLoginEntryPoint";
+    static final String ATT_LOGIN_URL = "loginUrl";
+    static final String DEF_LOGIN_URL = "/j_spring_security_check";
+    
+    static final String ATT_LOGIN_PAGE = "loginPage";
+    static final String DEF_LOGIN_PAGE = DefaultLoginPageGeneratingFilter.DEFAULT_LOGIN_PAGE_URL;
 
-    private static final String LOGIN_URL_ATTRIBUTE = "loginUrl";
-    private static final String LOGIN_PAGE_ATTRIBUTE = "loginPage";
+    static final String ATT_FORM_LOGIN_TARGET_URL = "defaultTargetUrl";
+    static final String DEF_FORM_LOGIN_TARGET_URL = "/";
 
-    private static final String FORM_LOGIN_TARGET_URL_ATTRIBUTE = "defaultTargetUrl";
-    private static final String DEFAULT_FORM_LOGIN_TARGET_URL = "/";
-
-    private static final String FORM_LOGIN_AUTH_FAILURE_URL_ATTRIBUTE = "defaultTargetUrl";
+    static final String ATT_FORM_LOGIN_AUTHENTICATION_FAILURE_URL = "authenticationFailureUrl";
+    static final String DEF_FORM_LOGIN_AUTHENTICATION_FAILURE_URL = DefaultLoginPageGeneratingFilter.DEFAULT_LOGIN_PAGE_URL + "?" + DefaultLoginPageGeneratingFilter.ERROR_PARAMETER_NAME;
 
     public BeanDefinition parse(Element elt, ParserContext parserContext) {
         ConfigUtils.registerProviderManagerIfNecessary(parserContext);
@@ -39,28 +41,28 @@ public class FormLoginBeanDefinitionParser implements BeanDefinitionParser {
         BeanDefinition filterBean = createFilterBean(elt);
 
         filterBean.getPropertyValues().addPropertyValue("authenticationManager",
-                new RuntimeBeanReference(ConfigUtils.DEFAULT_AUTH_MANAGER_ID));
+                new RuntimeBeanReference(BeanIds.AUTHENTICATION_MANAGER));
 
         BeanDefinitionBuilder entryPointBuilder =
                 BeanDefinitionBuilder.rootBeanDefinition(AuthenticationProcessingFilterEntryPoint.class);
 
-        String loginPage = elt.getAttribute(LOGIN_PAGE_ATTRIBUTE);
+        String loginPage = elt.getAttribute(ATT_LOGIN_PAGE);
 
         // If no login page has been defined, add in the default page generator.
         if (!StringUtils.hasText(loginPage)) {
             logger.info("No login page configured in form-login element. The default internal one will be used. Use" +
                     "the 'loginPage' attribute to specify the URL of the login page.");
-            loginPage = DefaultLoginPageGeneratingFilter.DEFAULT_LOGIN_PAGE_URL;
+            loginPage = DEF_LOGIN_PAGE;
             RootBeanDefinition loginPageFilter = new RootBeanDefinition(DefaultLoginPageGeneratingFilter.class);
             loginPageFilter.getConstructorArgumentValues().addGenericArgumentValue(
-                    new RuntimeBeanReference(DEFAULT_FORM_LOGIN_FILTER_ID));
-            parserContext.getRegistry().registerBeanDefinition("_springSecurityLoginPageFilter", loginPageFilter);
+                    new RuntimeBeanReference(BeanIds.FORM_LOGIN_FILTER));
+            parserContext.getRegistry().registerBeanDefinition(BeanIds.DEFAULT_LOGIN_PAGE_GENERATING_FILTER, loginPageFilter);
         }
 
         entryPointBuilder.addPropertyValue("loginFormUrl", loginPage);
 
-        parserContext.getRegistry().registerBeanDefinition(DEFAULT_FORM_LOGIN_FILTER_ID, filterBean);
-        parserContext.getRegistry().registerBeanDefinition(DEFAULT_FORM_LOGIN_ENTRY_POINT_ID,
+        parserContext.getRegistry().registerBeanDefinition(BeanIds.FORM_LOGIN_FILTER, filterBean);
+        parserContext.getRegistry().registerBeanDefinition(BeanIds.FORM_LOGIN_ENTRY_POINT,
                 entryPointBuilder.getBeanDefinition());
 
         return null;
@@ -70,24 +72,26 @@ public class FormLoginBeanDefinitionParser implements BeanDefinitionParser {
         BeanDefinitionBuilder filterBuilder =
                 BeanDefinitionBuilder.rootBeanDefinition(AuthenticationProcessingFilter.class);
 
-        String loginUrl = elt.getAttribute(LOGIN_URL_ATTRIBUTE);
+        String loginUrl = elt.getAttribute(ATT_LOGIN_URL);
 
-        if (StringUtils.hasText(loginUrl)) {
-            filterBuilder.addPropertyValue("filterProcessesUrl", loginUrl);
+        if (!StringUtils.hasText(loginUrl)) {
+        	loginUrl = DEF_LOGIN_URL;
         }
 
-        String defaultTargetUrl = elt.getAttribute(FORM_LOGIN_TARGET_URL_ATTRIBUTE);
+        filterBuilder.addPropertyValue("filterProcessesUrl", loginUrl);
+
+        String defaultTargetUrl = elt.getAttribute(ATT_FORM_LOGIN_TARGET_URL);
 
         if (!StringUtils.hasText(defaultTargetUrl)) {
-            defaultTargetUrl = DEFAULT_FORM_LOGIN_TARGET_URL;
+            defaultTargetUrl = DEF_FORM_LOGIN_TARGET_URL;
         }
 
         filterBuilder.addPropertyValue("defaultTargetUrl", defaultTargetUrl);
 
-        String authenticationFailureUrl = elt.getAttribute(FORM_LOGIN_AUTH_FAILURE_URL_ATTRIBUTE);
+        String authenticationFailureUrl = elt.getAttribute(ATT_FORM_LOGIN_AUTHENTICATION_FAILURE_URL);
 
         if (!StringUtils.hasText(authenticationFailureUrl)) {
-            authenticationFailureUrl = DefaultLoginPageGeneratingFilter.DEFAULT_LOGIN_PAGE_URL + "?" + DefaultLoginPageGeneratingFilter.ERROR_PARAMETER_NAME;
+            authenticationFailureUrl = DEF_FORM_LOGIN_AUTHENTICATION_FAILURE_URL;
         }
 
         filterBuilder.addPropertyValue("authenticationFailureUrl", authenticationFailureUrl);

+ 25 - 42
core/src/main/java/org/springframework/security/config/HttpSecurityBeanDefinitionParser.java

@@ -38,38 +38,21 @@ import java.util.Map;
 /**
  * Sets up HTTP security: filter stack and protected URLs.
  *
- *
  * @author Luke Taylor
  * @author Ben Alex
  * @version $Id$
  */
 public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser {
 
-    public static final String DEFAULT_FILTER_CHAIN_PROXY_ID = "_filterChainProxy";
-
-    public static final String DEFAULT_HTTP_SESSION_FILTER_ID = "_httpSessionContextIntegrationFilter";
-    public static final String DEFAULT_LOGOUT_FILTER_ID = "_logoutFilter";
-    public static final String DEFAULT_EXCEPTION_TRANSLATION_FILTER_ID = "_exceptionTranslationFilter";
-    public static final String DEFAULT_FILTER_SECURITY_INTERCEPTOR_ID = "_filterSecurityInterceptor";
-    public static final String DEFAULT_CHANNEL_PROCESSING_FILTER_ID = "_channelProcessingFilter";
-    public static final String DEFAULT_CHANNEL_DECISION_MANAGER_ID = "_channelDecisionManager";
-
-    public static final String CONCURRENT_SESSIONS_ELEMENT = "concurrent-session-control";
-    public static final String LOGOUT_ELEMENT = "logout";
-    public static final String FORM_LOGIN_ELEMENT = "form-login";
-    public static final String BASIC_AUTH_ELEMENT = "http-basic";
-    public static final String REMEMBER_ME_ELEMENT = "remember-me";
-    public static final String ANONYMOUS_ELEMENT = "anonymous";
-
-    static final String PATH_PATTERN_ATTRIBUTE = "pattern";
-    static final String PATTERN_TYPE_ATTRIBUTE = "pathType";
-    static final String PATTERN_TYPE_REGEX = "regex";
+    static final String ATT_PATH_PATTERN = "pattern";
+    static final String ATT_PATTERN_TYPE = "pathType";
+    static final String ATT_PATTERN_TYPE_REGEX = "regex";
 
-    static final String FILTERS_ATTRIBUTE = "filters";
+    static final String ATT_FILTERS = "filters";
     static final String NO_FILTERS_VALUE = "none";
 
-    private static final String ACCESS_CONFIG_ATTRIBUTE = "access";
-    private static final String REQUIRES_CHANNEL_ATTRIBUTE = "requiresChannel";
+    static final String ATT_ACCESS_CONFIG = "access";
+    static final String ATT_REQUIRES_CHANNEL = "requiresChannel";
 
     public BeanDefinition parse(Element element, ParserContext parserContext) {
         RootBeanDefinition filterChainProxy = new RootBeanDefinition(FilterChainProxy.class);
@@ -92,12 +75,12 @@ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser {
 
         Map filterChainMap =  new LinkedHashMap();
 
-        String patternType = element.getAttribute(PATTERN_TYPE_ATTRIBUTE);
+        String patternType = element.getAttribute(ATT_PATTERN_TYPE);
 
         FilterInvocationDefinitionMap interceptorFilterInvDefSource = new PathBasedFilterInvocationDefinitionMap();
         FilterInvocationDefinitionMap channelFilterInvDefSource = new PathBasedFilterInvocationDefinitionMap();
 
-        if (patternType.equals(PATTERN_TYPE_REGEX)) {
+        if (patternType.equals(ATT_PATTERN_TYPE_REGEX)) {
             filterChainProxy.getPropertyValues().addPropertyValue("matcher", new RegexUrlPathMatcher());
             interceptorFilterInvDefSource = new RegExpBasedFilterInvocationDefinitionMap();
             channelFilterInvDefSource = new RegExpBasedFilterInvocationDefinitionMap();
@@ -120,7 +103,7 @@ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser {
             // At least one channel requirement has been specified
             RootBeanDefinition channelFilter = new RootBeanDefinition(ChannelProcessingFilter.class);
             channelFilter.getPropertyValues().addPropertyValue("channelDecisionManager",
-                    new RuntimeBeanReference(DEFAULT_CHANNEL_DECISION_MANAGER_ID));
+                    new RuntimeBeanReference(BeanIds.CHANNEL_DECISION_MANAGER));
 
             channelFilter.getPropertyValues().addPropertyValue("filterInvocationDefinitionSource",
                     channelFilterInvDefSource);
@@ -130,17 +113,17 @@ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser {
             channelProcessors.add(new InsecureChannelProcessor());
             channelDecisionManager.getPropertyValues().addPropertyValue("channelProcessors", channelProcessors);
 
-            registry.registerBeanDefinition(DEFAULT_CHANNEL_PROCESSING_FILTER_ID, channelFilter);
-            registry.registerBeanDefinition(DEFAULT_CHANNEL_DECISION_MANAGER_ID, channelDecisionManager);
+            registry.registerBeanDefinition(BeanIds.CHANNEL_PROCESSING_FILTER, channelFilter);
+            registry.registerBeanDefinition(BeanIds.CHANNEL_DECISION_MANAGER, channelDecisionManager);
         }
 
-        Element sessionControlElt = DomUtils.getChildElementByTagName(element, CONCURRENT_SESSIONS_ELEMENT);
+        Element sessionControlElt = DomUtils.getChildElementByTagName(element, Elements.CONCURRENT_SESSIONS);
 
         if (sessionControlElt != null) {
             new ConcurrentSessionsBeanDefinitionParser().parse(sessionControlElt, parserContext);
         }
 
-        Element anonymousElt = DomUtils.getChildElementByTagName(element, ANONYMOUS_ELEMENT);
+        Element anonymousElt = DomUtils.getChildElementByTagName(element, Elements.ANONYMOUS);
         
         if (anonymousElt != null) {
             new AnonymousBeanDefinitionParser().parse(anonymousElt, parserContext);
@@ -149,35 +132,35 @@ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser {
         // Parse remember me before logout as RememberMeServices is also a LogoutHandler implementation.
 
 
-        Element rememberMeElt = DomUtils.getChildElementByTagName(element, REMEMBER_ME_ELEMENT);
+        Element rememberMeElt = DomUtils.getChildElementByTagName(element, Elements.REMEMBER_ME);
 
         if (rememberMeElt != null) {
             new RememberMeBeanDefinitionParser().parse(rememberMeElt, parserContext);
         }
 
-        Element logoutElt = DomUtils.getChildElementByTagName(element, LOGOUT_ELEMENT);
+        Element logoutElt = DomUtils.getChildElementByTagName(element, Elements.LOGOUT);
 
         if (logoutElt != null) {
             new LogoutBeanDefinitionParser().parse(logoutElt, parserContext);
         }
 
-        Element formLoginElt = DomUtils.getChildElementByTagName(element, FORM_LOGIN_ELEMENT);
+        Element formLoginElt = DomUtils.getChildElementByTagName(element, Elements.FORM_LOGIN);
 
         if (formLoginElt != null) {
             new FormLoginBeanDefinitionParser().parse(formLoginElt, parserContext);
         }
 
-        Element basicAuthElt = DomUtils.getChildElementByTagName(element, BASIC_AUTH_ELEMENT);
+        Element basicAuthElt = DomUtils.getChildElementByTagName(element, Elements.BASIC_AUTH);
 
         if (basicAuthElt != null) {
             new BasicAuthenticationBeanDefinitionParser().parse(basicAuthElt, parserContext);
         }
 
-        registry.registerBeanDefinition(DEFAULT_FILTER_CHAIN_PROXY_ID, filterChainProxy);
-        registry.registerBeanDefinition(DEFAULT_HTTP_SESSION_FILTER_ID, httpSCIF);
-        registry.registerBeanDefinition(DEFAULT_EXCEPTION_TRANSLATION_FILTER_ID,
+        registry.registerBeanDefinition(BeanIds.FILTER_CHAIN_PROXY, filterChainProxy);
+        registry.registerBeanDefinition(BeanIds.HTTP_SESSION_CONTEXT_INTEGRATION_FILTER, httpSCIF);
+        registry.registerBeanDefinition(BeanIds.EXCEPTION_TRANSLATION_FILTER,
                 exceptionTranslationFilterBuilder.getBeanDefinition());
-        registry.registerBeanDefinition(DEFAULT_FILTER_SECURITY_INTERCEPTOR_ID,
+        registry.registerBeanDefinition(BeanIds.FILTER_SECURITY_INTERCEPTOR,
                 filterSecurityInterceptorBuilder.getBeanDefinition());
 
 
@@ -205,11 +188,11 @@ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser {
         while (urlEltsIterator.hasNext()) {
             Element urlElt = (Element) urlEltsIterator.next();
 
-            String path = urlElt.getAttribute(PATH_PATTERN_ATTRIBUTE);
+            String path = urlElt.getAttribute(ATT_PATH_PATTERN);
 
             Assert.hasText(path, "path attribute cannot be empty or null");
 
-            String access = urlElt.getAttribute(ACCESS_CONFIG_ATTRIBUTE);
+            String access = urlElt.getAttribute(ATT_ACCESS_CONFIG);
 
             // Convert the comma-separated list of access attributes to a ConfigAttributeDefinition
             if (StringUtils.hasText(access)) {
@@ -217,7 +200,7 @@ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser {
                 interceptorFilterInvDefSource.addSecureUrl(path, (ConfigAttributeDefinition) editor.getValue());
             }
 
-            String requiredChannel = urlElt.getAttribute(REQUIRES_CHANNEL_ATTRIBUTE);
+            String requiredChannel = urlElt.getAttribute(ATT_REQUIRES_CHANNEL);
 
             if (StringUtils.hasText(requiredChannel)) {
                 String channelConfigAttribute = null;
@@ -234,7 +217,7 @@ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser {
                 channelFilterInvDefSource.addSecureUrl(path, (ConfigAttributeDefinition) editor.getValue());
             }
 
-            String filters = urlElt.getAttribute(FILTERS_ATTRIBUTE);
+            String filters = urlElt.getAttribute(ATT_FILTERS);
 
             if (StringUtils.hasText(filters)) {
                 if (!filters.equals(NO_FILTERS_VALUE)) {

+ 6 - 6
core/src/main/java/org/springframework/security/config/HttpSecurityConfigPostProcessor.java

@@ -38,7 +38,7 @@ public class HttpSecurityConfigPostProcessor implements BeanFactoryPostProcessor
     public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
         ConfigUtils.registerAccessManagerIfNecessary(beanFactory);
         BeanDefinition securityInterceptor =
-                beanFactory.getBeanDefinition(HttpSecurityBeanDefinitionParser.DEFAULT_FILTER_SECURITY_INTERCEPTOR_ID);
+                beanFactory.getBeanDefinition(BeanIds.FILTER_SECURITY_INTERCEPTOR);
 
         ConfigUtils.configureSecurityInterceptor(beanFactory, securityInterceptor);
 
@@ -54,7 +54,7 @@ public class HttpSecurityConfigPostProcessor implements BeanFactoryPostProcessor
     private void configureRememberMeSerices(ConfigurableListableBeanFactory beanFactory) {
         try {
             BeanDefinition rememberMeServices =
-                    beanFactory.getBeanDefinition(RememberMeBeanDefinitionParser.DEFAULT_REMEMBER_ME_SERVICES_ID);
+                    beanFactory.getBeanDefinition(BeanIds.REMEMBER_ME_SERVICES);
             rememberMeServices.getPropertyValues().addPropertyValue("userDetailsService",
                     ConfigUtils.getUserDetailsService(beanFactory));
         } catch (NoSuchBeanDefinitionException e) {
@@ -101,14 +101,14 @@ public class HttpSecurityConfigPostProcessor implements BeanFactoryPostProcessor
         logger.info("Selecting AuthenticationEntryPoint for use in ExceptionTranslationFilter");
 
         BeanDefinition etf =
-                beanFactory.getBeanDefinition(HttpSecurityBeanDefinitionParser.DEFAULT_EXCEPTION_TRANSLATION_FILTER_ID);
+                beanFactory.getBeanDefinition(BeanIds.EXCEPTION_TRANSLATION_FILTER);
         Map entryPointMap = beanFactory.getBeansOfType(AuthenticationEntryPoint.class);
         List entryPoints = new ArrayList(entryPointMap.values());
 
         Assert.isTrue(entryPoints.size() > 0, "No AuthenticationEntryPoint instances defined");
 
         AuthenticationEntryPoint mainEntryPoint = (AuthenticationEntryPoint)
-                entryPointMap.get(FormLoginBeanDefinitionParser.DEFAULT_FORM_LOGIN_ENTRY_POINT_ID);
+                entryPointMap.get(BeanIds.FORM_LOGIN_ENTRY_POINT);
 
         if (mainEntryPoint == null) {
             throw new SecurityConfigurationException("Failed to resolve authentication entry point");
@@ -121,7 +121,7 @@ public class HttpSecurityConfigPostProcessor implements BeanFactoryPostProcessor
 
     private void configureFilterChain(ConfigurableListableBeanFactory beanFactory) {
         FilterChainProxy filterChainProxy =
-                (FilterChainProxy) beanFactory.getBean(HttpSecurityBeanDefinitionParser.DEFAULT_FILTER_CHAIN_PROXY_ID);
+                (FilterChainProxy) beanFactory.getBean(BeanIds.FILTER_CHAIN_PROXY);
         // Set the default match
         List defaultFilterChain = orderFilters(beanFactory);
 
@@ -139,7 +139,7 @@ public class HttpSecurityConfigPostProcessor implements BeanFactoryPostProcessor
         if (!sessionFilters.isEmpty()) {
             logger.info("Concurrent session filter in use, setting 'forceEagerSessionCreation' to true");
             HttpSessionContextIntegrationFilter scif = (HttpSessionContextIntegrationFilter)
-                    beanFactory.getBean(HttpSecurityBeanDefinitionParser.DEFAULT_HTTP_SESSION_FILTER_ID);
+                    beanFactory.getBean(BeanIds.HTTP_SESSION_CONTEXT_INTEGRATION_FILTER);
             scif.setForceEagerSessionCreation(true);
         }
     }

+ 12 - 9
core/src/main/java/org/springframework/security/config/InterceptMethodsBeanDefinitionDecorator.java

@@ -26,11 +26,11 @@ import java.util.List;
 
 /**
  * @author Luke Taylor
+ * @author Ben Alex
+ * 
  * @version $Id$
  */
 public class InterceptMethodsBeanDefinitionDecorator implements BeanDefinitionDecorator {
-    private static final String POST_PROCESSOR_ID = "_interceptMethodsBeanfactoryPP";
-
     private BeanDefinitionDecorator delegate = new InternalInterceptMethodsBeanDefinitionDecorator();
 
     public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition, ParserContext parserContext) {
@@ -40,11 +40,11 @@ public class InterceptMethodsBeanDefinitionDecorator implements BeanDefinitionDe
     }
 
     private void registerPostProcessorIfNecessary(BeanDefinitionRegistry registry) {
-        if (registry.containsBeanDefinition(POST_PROCESSOR_ID)) {
+        if (registry.containsBeanDefinition(BeanIds.INTERCEPT_METHODS_BEAN_FACTORY_POST_PROCESSOR)) {
             return;
         }
 
-        registry.registerBeanDefinition(POST_PROCESSOR_ID,
+        registry.registerBeanDefinition(BeanIds.INTERCEPT_METHODS_BEAN_FACTORY_POST_PROCESSOR,
                 new RootBeanDefinition(MethodSecurityConfigPostProcessor.class));
     }
 
@@ -71,7 +71,10 @@ public class InterceptMethodsBeanDefinitionDecorator implements BeanDefinitionDe
  * post processor,
  */
 class InternalInterceptMethodsBeanDefinitionDecorator extends AbstractInterceptorDrivenBeanDefinitionDecorator {
-    private Log logger = LogFactory.getLog(getClass());
+    static final String ATT_CLASS = "class";
+	static final String ATT_METHOD = "method";
+	static final String ATT_ACCESS = "access";
+	private Log logger = LogFactory.getLog(getClass());
 
     protected BeanDefinition createInterceptorDefinition(Node node) {
         Element interceptMethodsElt = (Element)node;
@@ -79,7 +82,7 @@ class InternalInterceptMethodsBeanDefinitionDecorator extends AbstractIntercepto
 
         Element beanNode = (Element)interceptMethodsElt.getParentNode();
         // Get the class from the parent bean...
-        String targetClassName = beanNode.getAttribute("class");
+        String targetClassName = beanNode.getAttribute(ATT_CLASS);
         Class targetClass;
 
         try {
@@ -89,19 +92,19 @@ class InternalInterceptMethodsBeanDefinitionDecorator extends AbstractIntercepto
         }
 
         // Parse the included methods
-        List methods = DomUtils.getChildElementsByTagName(interceptMethodsElt, "protect");
+        List methods = DomUtils.getChildElementsByTagName(interceptMethodsElt, Elements.PROTECT);
         MethodDefinitionMap methodMap = new MethodDefinitionMap();
         ConfigAttributeEditor attributeEditor = new ConfigAttributeEditor();
 
         for (Iterator i = methods.iterator(); i.hasNext();) {
             Element protectmethodElt = (Element) i.next();
-            String accessConfig = protectmethodElt.getAttribute("access");
+            String accessConfig = protectmethodElt.getAttribute(ATT_ACCESS);
             attributeEditor.setAsText(accessConfig);
 
 // TODO: We want to use just the method names, but MethodDefinitionMap won't work that way.            
 //            methodMap.addSecureMethod(targetClass, protectmethodElt.getAttribute("method"),
 //                    (ConfigAttributeDefinition) attributeEditor.getValue());
-            methodMap.addSecureMethod(protectmethodElt.getAttribute("method"), 
+            methodMap.addSecureMethod(protectmethodElt.getAttribute(ATT_METHOD), 
                     (ConfigAttributeDefinition) attributeEditor.getValue());
         }
 

+ 10 - 7
core/src/main/java/org/springframework/security/config/LogoutBeanDefinitionParser.java

@@ -15,34 +15,37 @@ import org.w3c.dom.Element;
 
 /**
  * @author Luke Taylor
+ * @author Ben Alex
  * @version $Id$
  */
 public class LogoutBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
-    public static final String DEFAULT_LOGOUT_SUCCESS_URL = "/";
+    static final String ATT_LOGOUT_SUCCESS_URL = "logoutSuccessUrl";
+	static final String ATT_LOGOUT_URL = "logoutUrl";
+	public static final String DEF_LOGOUT_SUCCESS_URL = "/";
 
     protected Class getBeanClass(Element element) {
         return LogoutFilter.class;
     }
 
     protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
-        String logoutUrl = element.getAttribute("logoutUrl");
+        String logoutUrl = element.getAttribute(ATT_LOGOUT_URL);
 
         if (StringUtils.hasText(logoutUrl)) {
             builder.addPropertyValue("filterProcessesUrl", logoutUrl);
         }
 
-        String logoutSuccessUrl = element.getAttribute("logoutSuccessUrl");
+        String logoutSuccessUrl = element.getAttribute(ATT_LOGOUT_SUCCESS_URL);
 
         if (!StringUtils.hasText(logoutSuccessUrl)) {
-            logoutSuccessUrl = DEFAULT_LOGOUT_SUCCESS_URL;
+            logoutSuccessUrl = DEF_LOGOUT_SUCCESS_URL;
         }
 
         builder.addConstructorArg(logoutSuccessUrl);
         ManagedList handlers = new ManagedList();
         handlers.add(new SecurityContextLogoutHandler());
 
-        if (parserContext.getRegistry().containsBeanDefinition(RememberMeBeanDefinitionParser.DEFAULT_REMEMBER_ME_SERVICES_ID)) {
-            handlers.add(new RuntimeBeanReference(RememberMeBeanDefinitionParser.DEFAULT_REMEMBER_ME_SERVICES_ID));
+        if (parserContext.getRegistry().containsBeanDefinition(BeanIds.REMEMBER_ME_SERVICES)) {
+            handlers.add(new RuntimeBeanReference(BeanIds.REMEMBER_ME_SERVICES));
         }
 
         builder.addConstructorArg(handlers);
@@ -56,6 +59,6 @@ public class LogoutBeanDefinitionParser extends AbstractSingleBeanDefinitionPars
             return id;
         }
 
-        return HttpSecurityBeanDefinitionParser.DEFAULT_LOGOUT_FILTER_ID;
+        return BeanIds.LOGOUT_FILTER;
     }
 }

+ 16 - 15
core/src/main/java/org/springframework/security/config/RememberMeBeanDefinitionParser.java

@@ -18,24 +18,25 @@ import org.w3c.dom.Element;
 
 /**
  * @author Luke Taylor
+ * @author Ben Alex
  * @version $Id$
  */
 public class RememberMeBeanDefinitionParser implements BeanDefinitionParser {
-    protected final Log logger = LogFactory.getLog(getClass());
-
-    public static final String DEFAULT_REMEMBER_ME_FILTER_ID = "_rememberMeFilter";
-    public static final String DEFAULT_REMEMBER_ME_SERVICES_ID = "_rememberMeServices";
+    static final String ATT_KEY = "key";
+	static final String ATT_DATA_SOURCE = "dataSource";
+	static final String ATT_TOKEN_REPOSITORY = "tokenRepository";
+	protected final Log logger = LogFactory.getLog(getClass());
 
     public BeanDefinition parse(Element element, ParserContext parserContext) {
         BeanDefinition filter = new RootBeanDefinition(RememberMeProcessingFilter.class);
         BeanDefinition services = new RootBeanDefinition(PersistentTokenBasedRememberMeServices.class);
 
         filter.getPropertyValues().addPropertyValue("authenticationManager",
-                new RuntimeBeanReference(ConfigUtils.DEFAULT_AUTH_MANAGER_ID));
+                new RuntimeBeanReference(BeanIds.AUTHENTICATION_MANAGER));
 
-        String tokenRepository = element.getAttribute("tokenRepository");
-        String dataSource      = element.getAttribute("dataSource");
-        String key             = element.getAttribute("key");
+        String tokenRepository = element.getAttribute(ATT_TOKEN_REPOSITORY);
+        String dataSource      = element.getAttribute(ATT_DATA_SOURCE);
+        String key             = element.getAttribute(ATT_KEY);
 
         boolean dataSourceSet = StringUtils.hasText(dataSource);
         boolean tokenRepoSet = StringUtils.hasText(tokenRepository);
@@ -53,10 +54,10 @@ public class RememberMeBeanDefinitionParser implements BeanDefinitionParser {
                 tokenRepo = new RuntimeBeanReference(tokenRepository);
             } else {
                 tokenRepo = new RootBeanDefinition(JdbcTokenRepositoryImpl.class);
-                ((BeanDefinition)tokenRepo).getPropertyValues().addPropertyValue("dataSource",
+                ((BeanDefinition)tokenRepo).getPropertyValues().addPropertyValue(ATT_DATA_SOURCE,
                         new RuntimeBeanReference(dataSource));
             }
-            services.getPropertyValues().addPropertyValue("tokenRepository", tokenRepo);
+            services.getPropertyValues().addPropertyValue(ATT_TOKEN_REPOSITORY, tokenRepo);
         } else {
             isPersistent = false;
             services = new RootBeanDefinition(TokenBasedRememberMeServices.class);
@@ -67,20 +68,20 @@ public class RememberMeBeanDefinitionParser implements BeanDefinitionParser {
                     "will be ignored.");
         }
 
-        services.getPropertyValues().addPropertyValue("key", key);
+        services.getPropertyValues().addPropertyValue(ATT_KEY, key);
 
         BeanDefinition authManager = ConfigUtils.registerProviderManagerIfNecessary(parserContext);
         BeanDefinition provider = new RootBeanDefinition(RememberMeAuthenticationProvider.class);
-        provider.getPropertyValues().addPropertyValue("key", key);
+        provider.getPropertyValues().addPropertyValue(ATT_KEY, key);
 
         ManagedList providers = (ManagedList) authManager.getPropertyValues().getPropertyValue("providers").getValue();
         providers.add(provider);
 
         filter.getPropertyValues().addPropertyValue("rememberMeServices",
-                new RuntimeBeanReference(DEFAULT_REMEMBER_ME_SERVICES_ID));
+                new RuntimeBeanReference(BeanIds.REMEMBER_ME_SERVICES));
 
-        parserContext.getRegistry().registerBeanDefinition(DEFAULT_REMEMBER_ME_SERVICES_ID, services);
-        parserContext.getRegistry().registerBeanDefinition(DEFAULT_REMEMBER_ME_FILTER_ID, filter);
+        parserContext.getRegistry().registerBeanDefinition(BeanIds.REMEMBER_ME_SERVICES, services);
+        parserContext.getRegistry().registerBeanDefinition(BeanIds.REMEMBER_ME_FILTER, filter);
 
         return null;
     }

+ 7 - 7
core/src/main/java/org/springframework/security/config/RepositoryBeanDefinitionParser.java

@@ -21,10 +21,10 @@ import org.w3c.dom.Element;
  */
 class RepositoryBeanDefinitionParser implements BeanDefinitionParser {
 
-	private static final String ATT_CREATE_PROVIDER = "createProvider";
-	private static final String DEF_CREATE_PROVIDER = "true";
-	private static final String ATT_DATA_SOURCE = "dataSource";
-	private static final String ATT_ID = "id";
+	static final String ATT_CREATE_PROVIDER = "createProvider";
+	static final String ATT_DATA_SOURCE = "dataSource";
+	static final String ATT_ID = "id";
+	static final String DEF_CREATE_PROVIDER = "true";
 	
     public BeanDefinition parse(Element element, ParserContext parserContext) {
         boolean createProvider = true;
@@ -37,9 +37,9 @@ class RepositoryBeanDefinitionParser implements BeanDefinitionParser {
             ConfigUtils.registerProviderManagerIfNecessary(parserContext);
     	}
 
-        Element userServiceElt = DomUtils.getChildElementByTagName(element, Elements.ELT_USER_SERVICE);
-        Element jdbcUserServiceElt = DomUtils.getChildElementByTagName(element, Elements.ELT_JDBC_USER_SERVICE);
-        Element customUserServiceElt = DomUtils.getChildElementByTagName(element, Elements.ELT_CUSTOM_USER_SERVICE);
+        Element userServiceElt = DomUtils.getChildElementByTagName(element, Elements.USER_SERVICE);
+        Element jdbcUserServiceElt = DomUtils.getChildElementByTagName(element, Elements.JDBC_USER_SERVICE);
+        Element customUserServiceElt = DomUtils.getChildElementByTagName(element, Elements.CUSTOM_USER_SERVICE);
 
         if (userServiceElt != null) {
             BeanDefinition userDetailsService = new UserServiceBeanDefinitionParser().parse(userServiceElt, parserContext);

+ 8 - 7
core/src/main/java/org/springframework/security/config/SecurityNamespaceHandler.java

@@ -6,17 +6,18 @@ import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
  * Registers the bean definition parsers for the "security" namespace (http://www.springframework.org/schema/security).
  *
  * @author Luke Taylor
+ * @author Ben Alex
  * @version $Id$
  */
 public class SecurityNamespaceHandler extends NamespaceHandlerSupport {    
 
     public void init() {
-        registerBeanDefinitionParser("ldap", new LdapBeanDefinitionParser());
-        registerBeanDefinitionParser("http", new HttpSecurityBeanDefinitionParser());
-        registerBeanDefinitionParser("user-service", new UserServiceBeanDefinitionParser());
-        registerBeanDefinitionParser("repository", new RepositoryBeanDefinitionParser());
-        //registerBeanDefinitionParser("authentication-provider", new AuthenticationProviderBeanDefinitionParser());
-        registerBeanDefinitionDecorator("intercept-methods", new InterceptMethodsBeanDefinitionDecorator());
-        registerBeanDefinitionDecorator("filter-chain-map", new FilterChainMapBeanDefinitionDecorator());        
+        registerBeanDefinitionParser(Elements.LDAP, new LdapBeanDefinitionParser());
+        registerBeanDefinitionParser(Elements.HTTP, new HttpSecurityBeanDefinitionParser());
+        registerBeanDefinitionParser(Elements.USER_SERVICE, new UserServiceBeanDefinitionParser());
+        registerBeanDefinitionParser(Elements.REPOSITORY, new RepositoryBeanDefinitionParser());
+        registerBeanDefinitionParser(Elements.AUTHENTICATION_PROVIDER, new AuthenticationProviderBeanDefinitionParser());
+        registerBeanDefinitionDecorator(Elements.INTERCEPT_METHODS, new InterceptMethodsBeanDefinitionDecorator());
+        registerBeanDefinitionDecorator(Elements.FILTER_CHAIN_MAP, new FilterChainMapBeanDefinitionDecorator());        
     }
 }

+ 11 - 8
core/src/main/java/org/springframework/security/config/UserServiceBeanDefinitionParser.java

@@ -18,28 +18,31 @@ import java.util.Iterator;
 
 /**
  * @author Luke Taylor
+ * @author Ben Alex
  * @version $Id$
  */
 public class UserServiceBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
 
-    public static final String DEFAULT_ID = "_userDetailsService";
+    static final String ATT_PASSWORD = "password";
+	static final String ATT_NAME = "name";
+	static final String ELT_USER = "user";
+	static final String ATT_AUTHORITIES = "authorities";
 
-    protected Class getBeanClass(Element element) {
+	protected Class getBeanClass(Element element) {
         return InMemoryDaoImpl.class;
     }
 
-
     protected void doParse(Element element, BeanDefinitionBuilder builder) {
-        List userElts = DomUtils.getChildElementsByTagName(element, "user");
+        List userElts = DomUtils.getChildElementsByTagName(element, ELT_USER);
         UserMap users = new UserMap();
 
         for (Iterator i = userElts.iterator(); i.hasNext();) {
             Element userElt = (Element) i.next();
-            String userName = userElt.getAttribute("name");
-            String password = userElt.getAttribute("password");
+            String userName = userElt.getAttribute(ATT_NAME);
+            String password = userElt.getAttribute(ATT_PASSWORD);
 
             users.addUser(new User(userName, password, true, true, true, true,
-                    AuthorityUtils.commaSeparatedStringToAuthorityArray(userElt.getAttribute("authorities"))));
+                    AuthorityUtils.commaSeparatedStringToAuthorityArray(userElt.getAttribute(ATT_AUTHORITIES))));
         }
 
         builder.addPropertyValue("userMap", users);
@@ -54,6 +57,6 @@ public class UserServiceBeanDefinitionParser extends AbstractSingleBeanDefinitio
 
         // TODO: Check for duplicate using default id here.
 
-        return DEFAULT_ID;
+        return BeanIds.USER_DETAILS_SERVICE;
     }
 }

+ 8 - 2
core/src/main/resources/org/springframework/security/config/spring-security-2.0.rnc

@@ -102,11 +102,17 @@ form-login =
     ## Sets up a form login configuration
     element form-login {form-login.attlist, empty}    
 form-login.attlist &=
-    ## The URL that the form is submitted to
-    [ a:defaultValue = "/j_spring_security_check" ] attribute loginUrl {xsd:string}?   
+    ## The URL that the login form is posted to. If unspecified, it defaults to /j_spring_security_check.
+    attribute loginUrl {xsd:string}?   
+form-login.attlist &=
+    ## The URL that will be redirected to after successful authentication, if the user's previous action could not be resumed. This generally happens if the user visits a login page without having first requested a secured operation that triggers authentication. If unspecified, defaults to the root of the application.
+    attribute defaultTargetUrl {xsd:string}?   
 form-login.attlist &=
     ## The URL for the login page. If no login URL is specified, Spring Security will automatically create a login URL at /spring_security_login and a corresponding filter to render that login URL when requested.
     attribute loginPage {xsd:string}?   
+form-login.attlist &=
+    ## The URL for the login failure page. If no login failure URL is specified, Spring Security will automatically create a failure login URL at /spring_security_login?login_error and a corresponding filter to render that login failure URL when requested.
+    attribute authenticationFailureUrl {xsd:string}?   
 
 filter-chain-map = 
     ## Used to explicitly configure a FilterChainProxy instance with a FilterChainMap

+ 12 - 2
core/src/main/resources/org/springframework/security/config/spring-security-2.0.xsd

@@ -214,9 +214,14 @@
     </xs:complexType>
   </xs:element>
   <xs:attributeGroup name="form-login.attlist">
-    <xs:attribute name="loginUrl" default="/j_spring_security_check" type="xs:string">
+    <xs:attribute name="loginUrl" type="xs:string">
       <xs:annotation>
-        <xs:documentation>The URL that the form is submitted to</xs:documentation>
+        <xs:documentation>The URL that the login form is posted to. If unspecified, it defaults to /j_spring_security_check.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="defaultTargetUrl" type="xs:string">
+      <xs:annotation>
+        <xs:documentation>The URL that will be redirected to after successful authentication, if the user's previous action could not be resumed. This generally happens if the user visits a login page without having first requested a secured operation that triggers authentication. If unspecified, defaults to the root of the application.</xs:documentation>
       </xs:annotation>
     </xs:attribute>
     <xs:attribute name="loginPage" type="xs:string">
@@ -224,6 +229,11 @@
         <xs:documentation>The URL for the login page. If no login URL is specified, Spring Security will automatically create a login URL at /spring_security_login and a corresponding filter to render that login URL when requested.</xs:documentation>
       </xs:annotation>
     </xs:attribute>
+    <xs:attribute name="authenticationFailureUrl" type="xs:string">
+      <xs:annotation>
+        <xs:documentation>The URL for the login failure page. If no login failure URL is specified, Spring Security will automatically create a failure login URL at /spring_security_login?login_error and a corresponding filter to render that login failure URL when requested.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
   </xs:attributeGroup>
   <xs:element name="filter-chain-map">
     <xs:annotation>

+ 1 - 1
core/src/test/java/org/springframework/security/config/CustomUserDetailsTests.java

@@ -38,7 +38,7 @@ public class CustomUserDetailsTests {
     
     @Test
     public void testProviderManagerSetup() {
-    	ProviderManager manager = (ProviderManager) appContext.getBean(ConfigUtils.DEFAULT_AUTH_MANAGER_ID);
+    	ProviderManager manager = (ProviderManager) appContext.getBean(BeanIds.AUTHENTICATION_MANAGER);
     	List providers = manager.getProviders();
     	assertTrue(providers.size() == 1);
     	assertTrue(providers.iterator().next() instanceof DaoAuthenticationProvider);

+ 2 - 2
core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java

@@ -44,7 +44,7 @@ public class HttpSecurityBeanDefinitionParserTests {
     @Test
     public void filterChainProxyShouldReturnEmptyFilterListForUnprotectedUrl() {
         FilterChainProxy filterChainProxy =
-                (FilterChainProxy) appContext.getBean(HttpSecurityBeanDefinitionParser.DEFAULT_FILTER_CHAIN_PROXY_ID);
+                (FilterChainProxy) appContext.getBean(BeanIds.FILTER_CHAIN_PROXY);
 
         List filters = filterChainProxy.getFilters("/unprotected");
 
@@ -54,7 +54,7 @@ public class HttpSecurityBeanDefinitionParserTests {
     @Test
     public void filterChainProxyShouldReturnCorrectFilterListForProtectedUrl() {
         FilterChainProxy filterChainProxy =
-                (FilterChainProxy) appContext.getBean(HttpSecurityBeanDefinitionParser.DEFAULT_FILTER_CHAIN_PROXY_ID);
+                (FilterChainProxy) appContext.getBean(BeanIds.FILTER_CHAIN_PROXY);
 
         List filterList = filterChainProxy.getFilters("/someurl");
 

+ 1 - 1
core/src/test/java/org/springframework/security/config/JdbcUserDetailsTests.java

@@ -39,7 +39,7 @@ public class JdbcUserDetailsTests {
     
     @Test
     public void testProviderManagerSetup() {
-    	ProviderManager manager = (ProviderManager) appContext.getBean(ConfigUtils.DEFAULT_AUTH_MANAGER_ID);
+    	ProviderManager manager = (ProviderManager) appContext.getBean(BeanIds.AUTHENTICATION_MANAGER);
     	List providers = manager.getProviders();
     	assertTrue(providers.size() == 1);
     	assertTrue(providers.iterator().next() instanceof DaoAuthenticationProvider);