4

我是 Spring 安全的新手,所以我尝试使用 Spring MVC 来处理无效登录,但最终出现 Page Not Found 404

在我的 security-context.xml 中,我有这个AuthenticationProvider处理所有的身份验证登录,所以基本上只是检查用户的帐户和密码,但由于某些原因,authentication-failure-url只要有无效的登录尝试,它就会一直说找不到 404。

  <security:authentication-manager alias="authenticationManager">
    <security:authentication-provider ref="AuthenticationProvider"/>
  </security:authentication-manager>

  <bean id="preAuthenticationFilter"
      class="authentication.PreAuthenticationFilter"
      p:authenticationManager-ref="authenticationManager" />

  <security:http auto-config="true">
    <security:intercept-url pattern="/member/**" access="MEMBER" requires-channel="https"/>
    <security:form-login login-page="/login"
                         username-parameter="email"
                         password-parameter="password"
                         default-target-url="/member/"
                         authentication-failure-url="/loginfailed" />
    <security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthenticationFilter" />
  </security:http>

但我确实有一个相应的控制器监听该 url 模式以处理无效登录。

@Controller
public class LoginController
{
    @RequestMapping(value = "/loginfailed", method = RequestMethod.GET)
    public String loginError(ModelMap model)
    {     
         model.addAttribute("error", "true");
         return "login";
    }
}

** * *更新* ** * *

在某些AuthenticationProvider时候,只要用户的凭据不正确,我就会验证用户并抛出异常(我不知道这是否重要)

@Component
public class AuthenticationProvider{
    private User validateUser(String userName, String password)
    {
        try{
            //authenticate user's info
            .......
        }
        catch (UnauthorizedAccessException e)
        {
             throw new BadCredentialsException(e);
        }
    }
}
4

1 回答 1

5

(作为评论的后续。)来自 j_spring_security_check 的 302 状态BadCredentialsException都是正确的。看起来您的控制器根本没有注册。您是否认为使用注释 bean@Controller不足以使其工作?引用文档

您可以使用调度程序上下文中的标准 Spring bean 定义显式定义带注释的控制器 bean。然而, @Controller构造型也允许自动检测,这与 Spring 对检测类路径中的组件类并为它们自动注册 bean 定义的一般支持相一致。

要启用此类带注释控制器的自动检测,您需要将组件扫描添加到您的配置中。使用 spring-context 模式,如以下 XML 片段所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

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

    <!-- ... -->

</beans>

(假设LoginController在 com.example 包中)。

可以使用简单的 bean 声明代替组件扫描:

<bean class="com.example.LoginController" />
于 2013-04-09T10:04:15.533 回答