11

Sto usando il postino per inviare un nome utente e una password senza il valore al mio server; è come username=null e password=null.Come creare una risposta personalizzata quando Spring Security riceve credenziali null (nome utente e password)?

enter image description here

Per controllare la sicurezza del mio server, io uso la sicurezza primavera 3.2. Quando riceve queste credenziali, la sicurezza di primavera risponde con questo errore.

Estado HTTP 500 - Fields must not be empty 

java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor 
    org.springframework.security.core.userdetails.User.<init>(User.java:99) 
    org.springframework.security.core.userdetails.User.<init>(User.java:69) 
    com.equifax.product.fraud.applicationprocessing.web.rest.interceptors.security.SecurityAuthenticationProvider.retrieveUser(SecurityAuthenticationProvider.java:59) 
    org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:132) 
    org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) 
    org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177) 
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:168) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
     org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 

Voglio output JSON con messaggio personalizzato con l'errore, come posso farlo?

Questo è il mio security.xml:

<security:http create-session="never" use-expressions="true" 
    auto-config="false"> 

    <security:intercept-url pattern="/application/**" 
     access="isFullyAuthenticated()" /> 
    <security:anonymous /> 
    <security:http-basic entry-point-ref="securityAccessDeniedEntryPoint" /> 
    <security:access-denied-handler ref="securityAccessDeniedHandler" /> 
</security:http> 

<security:authentication-manager alias="authenticationManager" 
    erase-credentials="false"> 
    <security:authentication-provider 
     ref="genericSecurityAuthenticationProvider" /> 
</security:authentication-manager> 

I'am usando Primavera 3.2

+0

Un generale, si usa biblioteca Jersey in questo progetto? –

+0

Seconda domanda, quale versione Spring usi? –

+0

@ThomasWeglinski Sto usando la molla 3.2 e non uso Jersey. – cheloncio

risposta

3

Utilizzare l'eccezione di serie della primavera sicurezza, gestirà da solo se hai già un gestore di eccezioni per trasformare i messaggi in risposta JSON.

 catch (Exception exception) 
     { 
      throw new AuthenticationCredentialsNotFoundException("Fields must not be empty", exception); 
     } 
+0

Per poter funzionare, è necessario creare un '' entry-point-handler'' e '' access-negato-handler'' con il tuo messaggio specifico – cheloncio

2

Che cosa si può fare è di definire un fagiolo AuthenticationFailureHandler, dopo aver implementato questo fagiolo, si può fare quello che vuoi all'interno del metodo onAuthenticationFailure().

XML Config:

<beans:bean id="myFailureHandler" class="my.custom.impl.MyCustomAuthenticationFailureHandler"/> 
<security:http ....> 
<security:form-login authentication-failure-handler-ref="myFailureHandler" /> 
</security:http> 

http://docs.spring.io/autorepo/docs/spring-security/3.2.0.RELEASE/apidocs/org/springframework/security/web/authentication/AuthenticationFailureHandler.html

Obs .: Se quello che si vuole fare non funzionano con questa soluzione è possibile implementare un AuthenticationProvider

+0

apper '' Estado HTTP 500 - Elaborazione richiesta fallita; l'eccezione annidata è com.example.product.fraud.basic.configuration.framework.exceptions.ConfigurationNotFoundException: Impossibile trovare la configurazione utente .' – cheloncio

+0

Un'altra operazione che è possibile eseguire è creare un gestore di eccezioni –

+0

La configurazione qui è errata - il gestore degli errori ha bisogno da impostare su un filtro specifico.Tuttavia, l'autenticazione di base non supporta un gestore di errori di autenticazione, quindi in questo caso non è un'opzione. –

4

Si passa la stringa di autenticazione base ":" (dopo la decodifica base64), così come si dice questo si traduce in una password vuota un nome utente. Lo BasicAuthenticationFilter passa al provider di autenticazione, che è il codice personalizzato (SecurityAuthenticationProvider), quindi è impossibile dire esattamente cosa fa. Da qualche parte in là stai creando un'istanza User con quei valori, che genera l'eccezione che stai vedendo. Invece dovresti controllare i valori vuoti nel tuo AuthenticationProvider e lanciare un Authenticationexception.

È inoltre necessario sostituire la funzione onUnsuccessfulAuthentication in BasicAuthenticationFilter per scrivere la risposta all'errore che si desidera. Dovrai configurarlo come custom filter anziché utilizzare l'elemento <security:http-basic />.

Problemi correlati