2012-10-04 11 views
10

Mam aplikację przy użyciu programu Spring Security 3.0.x. Nie mam zwyczaju AuthenticationProvider:Obsługa wyjątków w zabezpieczeniach wiosennych zabezpieczeń

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

Chciałbym wysłać kody odpowiedzi cutom każdego wyjątku, na przykład 404, 403 dla UsernameNotFoundException dla DisabledException itp Na razie mam tylko uwierzytelniania Awarii URL w moim wiosna konfiguracji bezpieczeństwa, więc dostaję przekierowanie do niego na każdym wyjątku w authenticate().

Odpowiedz

19

Authentication obsługi awarii:

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"); 
    } 
} 

konfiguracja:

<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> 
+0

Nie znalazłem metody showMessage() w klasie SimpleUrlAuthenticationFailureHandler (używam wersji Spring Security 3.1.x). Czy znasz wersję, której używasz? –

+0

Przepraszam, metoda showMessage jest specyficzna dla mojej implementacji i nie pochodzi z wiosny. Oryginalny kod był zbyt wiele do pokazania. – baraber

+0

@baraber jak przekazać typ wyjątku do metody kontrolera? – gstackoverflow

14

Zazwyczaj złym pomysłem jest podanie szczegółów na temat przyczyn niepowodzenia uwierzytelnienia, ponieważ może on dostarczyć atakującemu przydatnych informacji. Na przykład może zezwolić im na sprawdzanie poprawnych nazw kont.

Jeśli potrzebujesz dostosować elementy, zamiast używać authentication-failure-url, możesz użyć authentication-failure-handler-ref do wstrzyknięcia niestandardowego fasoli AuthenticationFailureHandler, gdzie możesz zaimplementować inne zachowanie w zależności od wyjątku.

+0

Jak przekazać informację od AuthenticationFailureHandler do kontrolera metody? – gstackoverflow

5

Skorzystaj z poniższych tagów dla uwierzytelniania Dostosuj w stronie 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> 

obejmują również poniżej biblioteki znaczników dla prawidłowo działającego

<%@ 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"%> 

...