2013-04-06 11 views
12

Ho un progetto Spring MVC + Spring Security.Impedire il reindirizzamento per l'accesso a Spring Security

<http auto-config="true" access-denied-page="/security/accessDenied" use-expressions="true" disable-url-rewriting="true"> 

... 
<intercept-url pattern="/dashboard/myaccount/**" access="hasAnyRole('ROLE_PERSON', 'ROLE_DEALER')"/> 
... 

<form-login login-page="/security/login" authentication-failure-url="/security/login?error=true" 
       default-target-url="/security/success" username-parameter="email" 
       password-parameter="secret"/> 
<logout invalidate-session="true" logout-success-url="/index" logout-url="/security/logout"/> 

Se un utente va alla pagina di login, in caso di successo verrà reindirizzato a "/ sicurezza/successo" dove faccio più cose nel controller con l'oggetto della sessione (record di userID, ... ecc)

Il mio problema è quando un utente GUEST sta per/dashboard/myaccount (che richiede AUTH), viene reindirizzato alla pagina di LOGIN (che non voglio, preferisco un 404 gettato). Dopo che Spring Security non sta reindirizzando verso/sicurezza/successo. Viene invece reindirizzato a/dashboard/myaccount.

Preferirei trovare un modo per disabilitare completamente questo reindirizzamento alla pagina di accesso in caso di GUEST che tenta di accedere a una pagina AUTH.

È un modo per farlo?

Tnx

risposta

5

trovato questo: sempre-uso-default-target = "true"

io in questo modo, la mia funzione di controllo è sempre invocato dopo ogni login.

11

si aggiunge una nuova authenticationEntryPoint:

<http auto-config="true" access-denied-page="/security/accessDenied" use-expressions="true" 
     disable-url-rewriting="true" entry-point-ref="authenticationEntryPoint"/> 

<beans:bean id="authenticationEntryPoint" class="a.b.c..AuthenticationEntryPoint"> 
    <beans:constructor-arg name="loginUrl" value="/security/login"/> 
</beans:bean> 

public class AuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {  
    public AuthenticationEntryPoint(String loginUrl) { 
     super(loginUrl); 
    } 

    @Override 
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { 
     response.sendError(403, "Forbidden"); 
    } 
} 
+1

Non c'è bisogno di creare il proprio AuthenticationEntryPoint, uso: org. springframework.security.web.authentication.Http403ForbiddenEntryPoint – unify

+0

@unify Sono contento di aver visto il tuo commento molto più pulito – ndrone

+0

Vuoi pl facilità dare un'occhiata alla mia domanda troppo https://stackoverflow.com/q/47849246/2556354 – madz

2

Nella configurazione annotata nel SpringSecurity 4 si può fare:

public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    // .... 
    http.exceptionHandling().authenticationEntryPoint(new AuthenticationEntryPoint() { 

     @Override 
     public void commence(HttpServletRequest request, HttpServletResponse response, 
       AuthenticationException authException) throws IOException, ServletException { 
      if (authException != null) { 
       response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
       response.getWriter().print("Unauthorizated...."); 
      } 
     } 
    }); 
    // .... 
} 

}

+0

Ho trovato questo consiglio aiutarmi in un'altra situazione. Grazie – madz

Problemi correlati