在我的security-context.xml
, 对于身份验证失败,我喜欢这样(注意authentication-failure-url
属性):
<security:form-login login-page="/auth/login"
authentication-failure-url="/auth/login?error=true"
default-target-url="/mvc/home"
always-use-default-target="true" />
对于拒绝访问,我使用这个:
<security:access-denied-handler error-page="/auth/access-denied"/>
里面的两个标签<security:http use-expressions="true">
。对我来说就像一个魅力,当 Spring 提供了如此易于使用的好标签时,我不知道你为什么要尝试以你正在做的方式配置它。
不知道能不能回答你的问题,希望对你有帮助。
编辑:
使用上面提供的配置,意味着您在后台使用默认的身份验证失败处理程序 ( SimpleUrlAuthenticationFailureHandler )。您可以通过更改属性forwardToDestination
值来更改默认行为(在生成失败的身份验证时默认执行重定向)。这就是 SimpleUrlAuthenticationFailureHandler 所做的:
/**
* Performs the redirect or forward to the {@code defaultFailureUrl} if set, otherwise returns a 401 error code.
* <p>
* If redirecting or forwarding, {@code saveException} will be called to cache the exception for use in
* the target view.
*/
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException {
if (defaultFailureUrl == null) {
logger.debug("No failure URL set, sending 401 Unauthorized error");
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authentication Failed: " + exception.getMessage());
} else {
saveException(request, exception);
if (forwardToDestination) {
logger.debug("Forwarding to " + defaultFailureUrl);
request.getRequestDispatcher(defaultFailureUrl).forward(request, response);
} else {
logger.debug("Redirecting to " + defaultFailureUrl);
redirectStrategy.sendRedirect(request, response, defaultFailureUrl);
}
}
}
所以我想我你SimpleUrlAuthenticationFailureHandler
在你的声明中声明并使用它应该工作security-context.xml
的方法设置提到的属性值。setUseForward(boolean forwardToDestination)
可能是这样的:
<bean id="simpleUrlAuthenticationFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
<property name="useForward" value="true">
</bean>
接着:
<security:form-login login-page="/auth/login"
authentication-failure-handler-ref="simpleUrlAuthenticationFailureHandler"
default-target-url="/mvc/home"
always-use-default-target="true" />
祝你好运。