2012-08-13 14 views
12

Ho notato che ci sono un paio di domande che chiedono questo argomento. Ho guardato attraverso di loro e non ero in grado di applicarli al mio specifico setup di primavera. Vorrei configurare il reindirizzamento dell'accesso per essere condizionale, in base al ruolo dell'utente. Questo è quello che ho finora:Spring Security condizionale di default-target-url

<http auto-config="true" use-expressions="true"> 
     <custom-filter ref="filterSecurityInterceptor" before="FILTER_SECURITY_INTERCEPTOR"/> 
     <access-denied-handler ref="accessDeniedHandler"/> 
     <form-login 
      login-page="/login" 
      default-target-url="/admin/index" 
      authentication-failure-url="/index?error=true" 
      /> 
     <logout logout-success-url="/index" invalidate-session="true"/> 
</http> 

ho pensato this question potrebbe essere nella stessa linea di quello che sto cercando di fare. Qualcuno sa come posso applicarlo però?

EDIT 1

<bean id="authenticationProcessingFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationSuccessHandler" ref="authenticationSuccessHandler"/> 
</bean> 
<bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler"> 
    <property name="defaultTargetUrl" value="/login.jsp"/> 
</bean> 

EDIT 2

Attualmente non ho una classe come public class Test implements AuthenticationSuccessHandler {} come mostrato in this example.

+3

La tua domanda è identica a [questo] (http://stackoverflow.com/questions/7470405/authenticationsuccesshandler-example-for-spring-security-3) –

+0

Grazie. Potresti controllare ** EDIT 1 **. Mi sto confondendo perché sto già assegnando una lezione di primavera a quel fagiolo? – ThreaT

+0

Non ha accesso al modulo un autenticazioneSuccessHandler? http://static.springsource.org/spring-security/site/docs/3.0.x/reference/appendix-namespace.html –

risposta

20

Ho testato il codice e funziona, non c'è scienza missilistica in esso

public class MySuccessHandler implements AuthenticationSuccessHandler { 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication) 
      throws IOException, ServletException { 
     Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities()); 
     if (roles.contains("ROLE_ADMIN")){ 
      response.sendRedirect("/Admin.html"); 
      return; 
     } 
     response.sendRedirect("/User.html"); 
    }  
} 

Cambiamenti nel vostro contesto di protezione:

<bean id="mySuccessHandler" class="my.domain.MySuccessHandler"> 
    </bean> 

<security:form-login ... authentication-success-handler-ref="mySuccessHandler"/> 

aggiornamento se si desidera utilizzare default-target-url approccio, funzionerà altrettanto bene, ma verrà attivato quando l'utente accede per la prima volta alla pagina di accesso:

<security:form-login default-target-url="/welcome.htm" />

@Controller 
public class WelcomeController { 
    @RequestMapping(value = "/welcome.htm") 
    protected View welcome() { 

     Set<String> roles = AuthorityUtils 
       .authorityListToSet(SecurityContextHolder.getContext() 
         .getAuthentication().getAuthorities()); 
     if (roles.contains("ROLE_ADMIN")) { 
      return new RedirectView("Admin.htm"); 
     } 
     return new RedirectView("User.htm"); 
    } 
} 
+0

e se volessi reindirizzare ad un altro dominio? @ Boris Treukhov – Mahdi

+1

Nel caso in cui qualcuno stia utilizzando il codice Java per il contesto Sprint: 'formLogin(). SuccessHandler (new MySuccessHandler())' – RAS