13

我有一个使用 Spring Security 3.0.x 的应用程序。我有一个习惯AuthenticationProvider

public class AppAuthenticationProvider implements AuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        ...
        if (!check1()) throw new UsernameNotFoundException();
        if (!check2()) throw new DisabledException();
        ...
    }

我想针对每个异常发送自定义响应代码,例如 UsernameNotFoundException 的 404、DisabledException 的 403 等。现在我的 spring 安全配置中只有 authentication-failure-url ,所以我在身份验证中的每个异常上都重定向到它()。

4

3 回答 3

22

身份验证失败处理程序:

public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
  super.onAuthenticationFailure(request, response, exception);
  if(exception.getClass().isAssignableFrom(UsernameNotFoundException.class)) {
    showMessage("BAD_CREDENTIAL");
  } else if (exception.getClass().isAssignableFrom(DisabledException.class)) {
    showMessage("USER_DISABLED");
  }
}

配置 :

<bean id="customAuthenticationFailureHandler"
      class="com.apackage.CustomAuthenticationFailureHandler">
    <property name="defaultFailureUrl" value="/index.jsp"/>
</bean>
<security:http auto-config="true">
  <security:form-login default-target-url="/welcome.jsp" authentication-failure-handler-ref="customAuthenticationFailureHandler" />
</security:http>
于 2012-10-05T14:59:35.987 回答
15

提供有关身份验证失败原因的详细信息通常是一个坏主意,因为它可以为攻击者提供有用的信息。例如,它可以允许他们探测有效的帐户名称。

如果您需要自定义事物,那么authentication-failure-url您可以使用authentication-failure-handler-ref注入自定义AuthenticationFailureHandlerbean 而不是使用 bean,您可以在其中根据异常实现不同的行为。

于 2012-10-04T19:31:52.367 回答
5

在 jsp 页面中使用以下标签进行自定义身份验证。

<c:if test="${sessionScope[\"SPRING_SECURITY_LAST_EXCEPTION\"].message eq 'Bad credentials'}">
Username/Password entered is incorrect.
</c:if>
<c:if test="${sessionScope[\"SPRING_SECURITY_LAST_EXCEPTION\"].message eq 'User is disabled'}">
Your account is disabled, please contact administrator.
</c:if>
<c:if test="${fn:containsIgnoreCase(sessionScope[\"SPRING_SECURITY_LAST_EXCEPTION\"].message,'A communications error has been detected')}">
Database connection is down, try after sometime.
</c:if>

还包括以下标签库以正常工作

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec"%>

...

于 2013-05-17T14:53:13.940 回答