2016-03-29 12 views
7

Ich habe eine Spring-Boot-Anwendung, die Feder Sicherheit verwendet, so in meinem Fall habe ich 2 Arten von Benutzern ein ADMIN, ein einfacher Benutzer ich bekomme die Daten aus einer Datenquelle, dann führe ich eine Abfrage, mein Problem ist mit Umleitung Ich habe für jeden Benutzer eine andere Homepage, die ich für den AuthenticationSuccessHandler verwenden möchte, aber es funktioniert nicht Bitte helfe das ist mein Code;AuthenticationSuccessHandler Spring Security

meine Spring Security-Klassen-Konfiguration:

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) 

} 

} 

und das ist mein 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"); 
    } 
} 
} 

und das ist der Fehler in der Konsole:

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

Und was wird erwartet, um eine Instanz des 'SecurityHandler' zu erstellen? Es gibt weder '@ Component' noch wird es als' @ Bean' deklariert. Also wird eine Instanz jemals existieren. –

+0

könnte mir erklären, bin wirklich ein Neuling im Frühjahr Sicherheit –

+0

Das hat nichts mit Spring-Sicherheit zu tun, das ist grundlegende Feder Nutzung ... Sie müssen Frühling, welche Objekte instanziieren, sonst kann es nicht autowire diese Instanzen. –

Antwort

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

Sie‘ v e verpasst @compoment in Ihrem successHandler-Klasse