Spring Security内存配置功能是否存在错误?

时间:2013-10-08 12:00:44

标签: spring spring-mvc spring-security

我相信我已经为我的Spring Security完成了所有必要的设置以使用Unicode,但是当使用内存中身份验证时,它不能在用户名中使用特殊的Unicode字符。由于Spring声称拥有内部化支持,当使用Unicode字符作为用户名时,这可能是Spring Security In-Memory的一个错误吗?请放心,我已经查阅了参考手册,论坛帖子(例如,How to hold japanese characters in SPRING MVC POJO's field),并完成了为Spring国际化设置所需的所有内容。但是,我遇到使用Unicode /特殊字符的Spring Security 3 In-Memory用户名匹配问题。请注意,我的应用程序,IDE和文件使用UTF-8,并且一切都很好,如果我使用特殊的Unicode字符作为用户名,则一切正常。我有一种感觉,这种不匹配的Unicode用户名可能是Spring Security In-Memory内化的一个错误,但是需要这个确认,或者如果我已经监督了什么,请告诉我?

我的摘要如下......

web.xml

      <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

弹簧servlet的context.xml中

        <default-servlet-handler />

        <interceptors>      
            <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
                <beans:property name="paramName" value="lang" />
            </beans:bean>

            <beans:bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
                <beans:property name="paramName" value="theme" />
            </beans:bean>   

        </interceptors> 


          <resources mapping="/resources/**" location="/resources/" />


        <beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <beans:property name="basename" value="classpath:messages" />
            <beans:property name="defaultEncoding" value="UTF-8"/>
        </beans:bean>

        <beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
            <beans:property name="defaultLocale" value="en"/>
        </beans:bean>

        <!-- Theme setup --> 
        <beans:bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource">
                <beans:property name="basenamePrefix" value="theme-" />
        </beans:bean>

        <beans:bean id="themeResolver" class="org.springframework.web.servlet.theme.CookieThemeResolver">
            <beans:property name="defaultThemeName" value="default" />
        </beans:bean>


        <beans:import resource="spring-security.xml"/>

         <context:component-scan base-package="com.myproject.platform" />

    </beans:beans>

弹簧security.xml文件

      <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />              


      <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="userService">                
            <password-encoder ref="encoder" />                      
        </authentication-provider> 
      </authentication-manager>

      <beans:import resource="user-security-bean-config.xml"/> 

user-security-bean-config.xml

        <user-service id="userService">
          <user name="ışığı" password="encodedpasswordstring" 
                         authorities="R_U,R_A"/>

        </user-service>

注意,如果我有用户名,例如isigi(没有特殊的unicode字符),那么一切运行良好。

在我的jsp文件中,我有顶行:

<%@ page language="java" session="false" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>

...在 head 部分,我有......

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

我的xml文件,UTF-8在顶行声明,例如

<?xml version="1.0" encoding="UTF-8"?>

不会抛出异常或错误。

1 个答案:

答案 0 :(得分:1)

为了其他可能遇到类似问题的人的利益,web.xml文件中 encodingFilter ORDER 非常重要,且必须位于顶部过滤器列表,否则将无法正常工作。即使我已经阅读了我发布的链接,不知何故我错过了两次,直到我昨晚读到第三个。我忘记在帖子中提到我已经在server.xml文件中将Tomcat设置正确配置为UTF-8,方法是在适当的位置添加 URIEncoding =&#34; UTF-8&#34; 如下:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" 
       URIEncoding="UTF-8"/>


<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />