java - 具有自定义身份验证提供程序的 Spring Security 不适用于用户名中的特殊字符

标签 java spring spring-mvc encoding spring-security

我正在使用 spring security 3.2.6.RELEASE,并且我已经实现了自己的自定义身份验证提供程序,以处理不同类型的失败登录。我需要在用户名中启用特殊字符。但是我无法让它发挥作用。

这是我的登录表单:

<form method="POST" action="<c:url value='j_spring_security_check'/>" accept-charset="utf-8" enctype="application/x-www-form-urlencoded">
    <!-- Table -->
    <table class="table">
        <tr>
            <td><msg:message code="label.username"/></td>
            <td><input type="text" name="username" /></td>
        </tr>
        <tr>
            <td><msg:message code="label.password"/></td>
            <td><input type="password" name="password" /></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Login" /></td>

        </tr>
    </table>
</form>

我还在我的 web.xml 中包含了 org.springframework.web.filter.CharacterEncodingFilter,如下所示:

<filter>
    <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
    <servlet-name>/*</servlet-name>
</filter-mapping>

它就在 Spring Security 过滤器之前:

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

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>ERROR</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

那么我在这里错过了什么?登录页面采用 utf-8 编码,当我使用 FF 开发人员工具/Firebug 检查时,用户名参数发送正确 - userä。在我的 CustomAuthenticationProvider 中进行调试:

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {

    UsernamePasswordAuthenticationToken token = null;
    UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken) authentication;

    // credentials given by the user
    String username = (String)auth.getPrincipal();
    String password = (String)auth.getCredentials();

我看到用户名是“user¤”并且登录失败。

谢谢大家的帮助! 等

最佳答案

<servlet-name>/*</servlet-name> 

应该是

<url-pattern>/*</url-pattern>

现在可以了。

关于java - 具有自定义身份验证提供程序的 Spring Security 不适用于用户名中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31513786/

相关文章:

mysql - 无法使用 SpringMVC 和 Hibernate Autowiring 字段

java - Spring MVC 如何返回 <select> 值作为表单/模型值?

如果列表包含某个字符串,java 从 List<String> 中删除项目

java - oracle.sql.CLOB 与 java.sql.Clob

java - Checkstyle 无需编辑器即可自动修复?

java - 在 Java 中的 GUI 中创建延迟

java - Spring Boot尝试使用@JsonTest注释在测试中创建mongo存储库

spring - 如何在Spring-ws中定位生成的wsdl的路径

Spring Security maxSession 不起作用

java - org.springframework.beans.factory.BeanInitializationException : Could not load properties