فهرست منبع

Tidied up logic for setting token repository in RememberMeBeanDefinitionParser. Plus some tinkering with attributes in rnc file.

Luke Taylor 18 سال پیش
والد
کامیت
0a50cd67ce

+ 28 - 13
core/src/main/java/org/springframework/security/config/RememberMeBeanDefinitionParser.java

@@ -21,10 +21,10 @@ import org.w3c.dom.Element;
  * @version $Id$
  */
 public class RememberMeBeanDefinitionParser implements BeanDefinitionParser {
-    protected final Log logger = LogFactory.getLog(getClass());    
+    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";   
+    public static final String DEFAULT_REMEMBER_ME_SERVICES_ID = "_rememberMeServices";
 
     public BeanDefinition parse(Element element, ParserContext parserContext) {
         BeanDefinition filter = new RootBeanDefinition(RememberMeProcessingFilter.class);
@@ -34,24 +34,39 @@ public class RememberMeBeanDefinitionParser implements BeanDefinitionParser {
                 new RuntimeBeanReference(ConfigUtils.DEFAULT_AUTH_MANAGER_ID));
 
         String tokenRepository = element.getAttribute("tokenRepository");
-        String dataSource = element.getAttribute("dataSource");
+        String dataSource      = element.getAttribute("dataSource");
+        String key             = element.getAttribute("key");
 
-        if (StringUtils.hasText(tokenRepository)) {
-            if (StringUtils.hasText(dataSource)) {
-                throw new SecurityConfigurationException("Specify tokenRepository or dataSource but not both");
-            }
+        boolean dataSourceSet = StringUtils.hasText(dataSource);
+        boolean tokenRepoSet = StringUtils.hasText(tokenRepository);
+
+        if (dataSourceSet && tokenRepoSet) {
+            throw new SecurityConfigurationException("Specify tokenRepository or dataSource but not both");
+        }
 
-            services.getPropertyValues().addPropertyValue("tokenRepository", new RuntimeBeanReference(tokenRepository));
+        boolean isPersistent = dataSourceSet | tokenRepoSet;
 
-        } else if (StringUtils.hasText(dataSource)) {
-            BeanDefinition tokenRepo = new RootBeanDefinition(JdbcTokenRepositoryImpl.class);
-            tokenRepo.getPropertyValues().addPropertyValue("dataSource", new RuntimeBeanReference(dataSource));
+        if (isPersistent) {
+            Object tokenRepo;
+
+            if (tokenRepoSet) {
+                tokenRepo = new RuntimeBeanReference(tokenRepository);
+            } else {
+                tokenRepo = new RootBeanDefinition(JdbcTokenRepositoryImpl.class);
+                ((BeanDefinition)tokenRepo).getPropertyValues().addPropertyValue("dataSource",
+                        new RuntimeBeanReference(dataSource));
+            }
+            services.getPropertyValues().addPropertyValue("tokenRepository", tokenRepo);
         } else {
-            // Not persistent
+            isPersistent = false;
             services = new RootBeanDefinition(TokenBasedRememberMeServices.class);
         }
+        
+        if (StringUtils.hasText(key) && isPersistent) {
+            logger.warn("The attribute 'key' ('" + key + "') is not required for persistent remember-me services and " +
+                    "will be ignored.");
+        }
 
-        String key = element.getAttribute("key");
         services.getPropertyValues().addPropertyValue("key", key);
 
         BeanDefinition authManager = ConfigUtils.registerProviderManagerIfNecessary(parserContext);

+ 3 - 4
core/src/main/resources/org/springframework/security/config/spring-security-2.0.rnc

@@ -136,11 +136,10 @@ concurrent-sessions.attlist &=
     attribute exceptionIfMaximumExceeded {"true" | "false"}?
 
 remember-me = 
-    element remember-me {remember-me.attlist}
-remember-me.attlist &= 
-    attribute key {xsd:string}
+    element remember-me {remember-me.attlist} 
+    
 remember-me.attlist &= 
-    (attribute tokenRepository {xsd:string} | attribute datasource {xsd:string})?        
+    (attribute key {xsd:string} | (attribute tokenRepository {xsd:string} | attribute datasource {xsd:string}))        
     
 authentication-provider =
     element authentication-provider {authentication-provider.attlist, (user-service | jdbc-user-service)}

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

@@ -248,7 +248,7 @@
     </xs:complexType>
   </xs:element>
   <xs:attributeGroup name="remember-me.attlist">
-    <xs:attribute name="key" use="required" type="xs:string"/>
+    <xs:attribute name="key" type="xs:string"/>
     <xs:attribute name="tokenRepository" type="xs:string"/>
     <xs:attribute name="datasource" type="xs:string"/>
   </xs:attributeGroup>