2

我正在尝试在我的文件中使用boolean我的参数。我不知道为什么我可以使用非布尔参数,但我得到一个布尔错误。application.propertiesspring-security configuration xml

如何使用布尔参数?

这是我的application.properties:

JDBC_CONNECTION_STRING=jdbc:mysql://localhost:3306/schema?user=username&password=password
protocol=http
USE_SECURE=false

我的 spring-security.xml 是:

< remember-me user-service-ref="internalUserDetails" data-source-ref="dataSource" key="this-is-my-key02203452416fw" use-secure-cookie="${USE_SECURE}" />

...但我收到此错误:cvc-datatype-valid.1.2.1: '${USE_SECURE}' is not a valid value for 'boolean'

我也尝试过设置USE_SECURE=False,但我再次遇到同样的错误。如何在 spring 安全配置 xml 文件中使用布尔参数?

这是我的 web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0" >

    <display-name> Name-MyApp</display-name> 

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <!-- Servlets -->
    <servlet>
        <servlet-name>MyApp</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Servlets Mappings -->
    <servlet-mapping>
        <servlet-name>MyApp</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
                /WEB-INF/servlet-context.xml,
            /WEB-INF/spring-security.xml
        </param-value>
    </context-param>

    <!-- Filters -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>httpMethodFilter</filter-name>
        <servlet-name>MyApp</servlet-name>
    </filter-mapping>    

    <filter> 
        <filter-name>httpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</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>
</web-app> 
4

2 回答 2

3

看起来,正在传递键 '${USE_SECURE}' 的值。当我想启动布尔值时遇到了类似的问题

<bean id="flag" class="java.lang.Boolean">
    <constructor-arg value="${FLAG}"/>
</bean>

它适用于“属性”,所以我以其他方式解决了我的案例。不知道是不是spring bug?

于 2013-02-18T14:38:11.223 回答
2

安全命名空间的 xsd 模式定义只允许use-secure-cookie属性中的布尔值。如果您没有指定允许的文字之一(“true”或“false”),您的 xml 将不会通过模式验证,甚至不会被解析。

因此,如果您使用安全命名空间配置,您将无法使用外部属性来设置此值。为了证明我的观点,下面是相关的代码片段RememberMeBeanDefinitionParser.parse()

String useSecureCookie = element.getAttribute("use-secure-cookie");
if (StringUtils.hasText(useSecureCookie)) {
    services.getPropertyValues().addPropertyValue(
                    "useSecureCookie", Boolean.valueOf(useSecureCookie));
}

如您所见,该属性立即转换为布尔值,因此没有任何机制可以进一步处理该值。

我不完全确定,但很可能这可以通过简单地放松 xsd 以允许任何字符串值来解决,并将该值传递给 bean 定义(services上面)而不将其转换为布尔值。PropertyPlaceholderConfigurer如果它恰好是一个属性占位符,那么 a可以稍后解析给定的值。

如果您想尝试一下,请随时在Spring Security 问题跟踪器中打开一张票。

于 2013-02-18T19:40:52.917 回答