2016-03-29 10 views
7

Ho un'applicazione di avvio a molla che utilizza la sicurezza di primavera, quindi nel mio caso ho 2 tipi di utenti uno ADMIN, uno un utente semplice ottengo i dati da un'origine dati quindi eseguo una query, il mio problema è con reindirizzamento ho per ogni utente una diversa homepage che sto usando per AthenticationSuccessHandler ma non funzionerà. Per favore, questo è il mio codice;AuthenticationSuccessHandler Spring Security

mia configurazione classe di sicurezza Primavera:

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.builders.WebSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; 
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; 

import javax.sql.DataSource ; 

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 


@Autowired 
Securityhandler successHandler ; 


//Pour l'authentification des Utilisateur de Table Utilisateur 
@Autowired 
public void GlobalConfig(AuthenticationManagerBuilder auth,DataSource dataSource) throws Exception { 
auth.jdbcAuthentication() 
    .dataSource(dataSource) 
    .usersByUsernameQuery("SELECT \"Pseudo\" AS principal , \"Password\" AS credentials , true FROM \"UTILISATEUR\" WHERE \"Pseudo\" = ? ") 
      .authoritiesByUsernameQuery("SELECT u.\"Pseudo\" AS principal , r.role as role FROM \"UTILISATEUR\" u ,\"Role\" r where u.id_role=r.id_role AND \"Pseudo\" = ? ") 
       .rolePrefix("_ROLE"); 
} 
    //ne pas appliqué la securité sur les ressources 
@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring() 
    .antMatchers("/bootstrap/**","/css/**"); 

} 
@Override 
protected void configure(HttpSecurity http) throws Exception { 
http 

    .csrf().disable() 
    .authorizeRequests() 

    .anyRequest() 
     .authenticated()   
      .and() 
      .formLogin() 
      .loginPage("/login") 
      .permitAll() 
      .successHandler(successHandler) 

} 

} 

e questo è il mio AuthenticationSuccessHandler

import java.io.IOException; 
import java.util.Set; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.security.core.Authentication; 
import org.springframework.security.core.authority.AuthorityUtils; 
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; 

public class Securityhandler implements AuthenticationSuccessHandler { 

public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { 
    Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities()); 
    if (roles.contains("ROLE_Admin")) { 
     response.sendRedirect("/admin/home.html"); 
    } 
} 
} 

e questo è l'errore nella console:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Injection of autowired dependencies failed; 
+0

E cosa si prevede di creare un'istanza di 'SecurityHandler'? Non esiste '@ Component' né è dichiarato come' @ Bean'. Quindi, ad esempio, esisterà mai. –

+0

potrebbe spiegarmi che sono davvero un novellino nella sicurezza di primavera –

+0

Che non ha nulla a che fare con la sicurezza Spring, che è l'utilizzo di base della molla ... Devi dire a primavera quali oggetti istanziare altrimenti non possono autorizzare quelle istanze. –

risposta

6
import java.io.IOException; 
import java.util.Set; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.security.core.Authentication; 
import org.springframework.security.core.authority.AuthorityUtils; 
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; 
import org.springframework.stereotype.Component; 

@Component 
public class Securityhandler implements AuthenticationSuccessHandler { 

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

te' v e perso @compoment nella tua classe hitHandler