如何让Spring Security不绕过控制器登录映射?

时间:2011-05-25 16:37:52

标签: java spring authentication spring-mvc spring-security

如果login.jsp发布到/login/submit

<form action="/login/submit" method="post">

并且applicationContext.xml定义了form-login元素:

<form-login login-page="/login" login-processing-url="/login/submit" authentication-failure-url="/login/error" />   

如何在相应的控制器方法中进行一些额外处理:

@RequestMapping(value = "/login/submit", method = RequestMethod.POST)

我定义了这样一个方法,但是当login.jsp发布其形式时,Spring Security从不调用它。而是调用loadUserByUsername并成功处理身份验证而不使用此控制器方法

2 个答案:

答案 0 :(得分:0)

我同意@stevels和@ericacm。需要更多信息才能告诉您最佳选择是什么。

永远不会调用控制器方法,因为您可能知道,Spring安全登录表单身份验证是在过滤器中进行的:UsernamePasswordAuthenticationFilter。当此过滤器成功验证表单时,请求将转发到目标URL。 (如果auth失败,则返回登录错误页面。)

在寻找修改某些默认身份验证行为时,您很可能希望从此过滤器开始。不要害怕单步执行代码!

答案 1 :(得分:0)

您可以使用名为“目标网址”的功能解决此问题。定义强制的,默认的成功目标网址 - 例如/login.submit.result。这将在成功登录到您可以由上下文中的任何控制器映射和控制的特定URL后重定向。当然,这将禁用“目标网址”的原始意图。如果您计划使用此解决方案并且必须在登录后重定向到页面,那么您必须在现有解决方案之上构建一个额外的“目标URL”(基于变量或内部会话参数)。