使用Spring Security内存身份验证进行内部化


问题内容

我已经阅读了参考手册,查看了论坛帖子例如,如何在SPRING MVCPOJO的字段中保留日语字符,据我所知,我已经完成了国际化Spring支持所需的所有工作。
Spring Security 3内存用户名使用Unicode/特殊字符匹配时出现问题。请注意,我的应用程序使用UTF-8,并且一切正常,包括输入Unicode密码在内都可以很好地工作(但是,这个Unicode密码很可能会误导您,因为它可能会将其转换为另一个字符,而改为编码该字符?)。我感觉这种不匹配的Unicode用户名可能是Spring Security内存内部化的一个错误,但需要对此进行确认。

为了读者的利益,我已经完成了所有必要的基本配置,并且请注意,如果我不对用户名使用Unicode字符,那么一切都会按预期进行,否则即使输入正确的凭据,身份验证也会失败。另外,不会引发任何异常。

我的摘要如下…

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>

spring-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>

spring-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"%>

…在 头部 ,我有…

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

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

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

问题答案:

对于其他人谁可能会遇到类似问题的利益,在 订单 中的 encodingFilter 在web.xml文件中是非常重要的,它必须是在 顶部
的筛选器列表中,否则将无法正常工作。即使我已经阅读了发布的链接,但还是以某种方式错过了两次,直到深夜第三次阅读为止。我忘了在帖子中提到我已经通过在适当的位置添加URIEncoding =“
UTF-8”来将server.xml文件中的Tomcat设置正确配置为UTF-8,如下所示:

<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" />

我希望这个答案(与问题中所述的设置一起)将帮助某人节省数小时甚至数夜的挫败感,以致于无法使用特殊的Unicode字符与Spring MVC /Security一起工作。