2017-01-17 4 views
0

EDIT:Frühling Boot-Sicherheits-Codierung Passwort leicht

Die einfachste Art, wie ich gefunden:

@SuppressWarnings("deprecation") 
@Configuration 
@EnableWebMvcSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    DataSource dataSource; 

    @Autowired 
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
     auth.jdbcAuthentication().dataSource(dataSource) 
     .usersByUsernameQuery(
       "SELECT username, password, abilitazione FROM public.utenti WHERE username=?") 
     .passwordEncoder(passwordEncoder()) 
     .authoritiesByUsernameQuery(
       "SELECT username, ruolo FROM public.ruoli_utente WHERE username=?"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     //omitted for brevity 
    } 

    @Bean 
    public PasswordEncoder passwordEncoder(){ 
     PasswordEncoder encoder = new BCryptPasswordEncoder(); 
     return encoder; 
    } 

in meiner dao Klasse I Benutzer hinzufügen wie folgt aus:

public void addElement(Utente u) { 
    String password = u.getPassword(); 
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
    String hashedPassword = passwordEncoder.encode(password); 
    u.setPassword(hashedPassword); 
    jdbcTemplate.update("INSERT INTO public.utenti(username, password, abilitazione, email, nome, cognome) VALUES (?, ?, ?, ?, ?, ?)", 
    new Object[] {u.getUsername(), u.getPassword(), u.getAbilitazione(), u.getEmail(), u.getNome(), u.getCognome()}); 

} 

Ich möchte das Passwort auf sehr einfache Weise verschlüsseln und entschlüsseln, egal ob es ein Nein ist t super sicher, es muss nur für meinen Zweck sicher sein. Also, in der Datenbank habe ich verschlüsselte Passwörter hinzugefügt. Wenn der Benutzer sich authentifizieren erkennt es das Passwort nicht, auch wenn ich es entschlüsseln. Ich habe es wie folgt aus:

@Configuration 
@EnableWebMvcSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    DataSource dataSource; 

    @Autowired 
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
     auth.jdbcAuthentication().dataSource(dataSource) 
     .usersByUsernameQuery(
       "SELECT username, decode(password,'base64'), abilitazione FROM public.utenti WHERE username=?") 
     .authoritiesByUsernameQuery(
       "SELECT username, ruolo FROM public.ruoli_utente WHERE username=?"); 
    } 
} 

Es könnte auf ähnliche Weise arbeiten (Decodierung direkt in usersByUsernameQuery Verfahren), oder muss ich ein paar Bohnen für die Decodierung erklären?

Antwort

1

Ich tat es auf diese Weise und scheint ziemlich sauber und offen für Veränderungen.

in Ihrer Anwendungsklasse:

@Bean 
public ApplicationSecurity applicationSecurity() { 
    return new ApplicationSecurity(); 
} 

Ihre Anwendungssicherheit Klasse

public class ApplicationSecurity extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailSecurityService userDetailSecurityService; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable().authorizeRequests().antMatchers("/ace/**", 
                  "/app/**", 
                  "/jquery/**", 
                  "/bootstrap/**", 
                  "/font-awesome/**", 
                  "/jstree/**", 
                  "/img/**").permitAll().anyRequest() 
      .fullyAuthenticated(); 

     http.csrf().disable().formLogin().loginPage("/login").failureUrl("/login?error=1").permitAll().defaultSuccessUrl("/configurator").and().logout().permitAll(); 

     http.headers().frameOptions().disable().addHeaderWriter(new StaticHeadersWriter("X-FRAME-OPTIONS", "SAMEORIGIN")); 
    } 

    @Override 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailSecurityService).passwordEncoder(passwordEncoder()); 
    } 


    @Bean 
    public PasswordEncoder passwordEncoder(){ 
     return new MD5PasswordEncoder(); 
    } 

} 

Und die Klasse MDPasswordEncoder oder jede Implementierung Sie verwenden möchten:

public class MD5PasswordEncoder implements PasswordEncoder { 

    @Override 
    public String encode(CharSequence charSequence) { 
     String encPass = ""; 
     try { 
      MessageDigest md = MessageDigest.getInstance("MD5"); 
      byte[] digest = md.digest(charSequence.toString().getBytes()); 
      byte[] b64 = Base64.encodeBase64(digest); 
      encPass = new String(b64); 
      encPass = encPass.replaceAll("=", ""); 
     }catch(Exception ex){ 
      logger.error("An exception trying to encode a password", ex); 
     } 
     return encPass; 
    } 

    @Override 
    public boolean matches(CharSequence charSequence, String s) { 
     return encode(charSequence).equals(s); 
    } 
} 

public interface UserDetailsService { 
    UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException; 
} 


@Service 
public class UserDetailSecurityService implements UserDetailsService{ 

    //Here your user service implementation 
    @Autowired 
    UserService userService; 

    //yuou need to oeverride this method name 
    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     // you need to create a method in your service to find users by name 
     return userService.findByUsername(username); 
    } 
} 

In diesem Fall Wenn Sie zu einer neuen Encoder-Methode wechseln müssen, müssen Sie nur eine neue Klasse mit dem p implementieren Roper-System und würde getan werden

+0

Wie haben Sie Ihre Klasse UserDetailSecurityService? – tina

+0

@tina hinzugefügt die 2 Klassen – cralfaro

+0

Ich versuche zu verstehen, warum, was ich getan habe, hat nicht funktioniert. Sie haben einen Klassenbenutzerservice geschrieben (der sicherlich eine userdao-Klasse verwendet), die das tut, was die Methode configAuthentication in meiner Klasse tut. Warum also, wenn ich eine Dekodierungsfunktion in meinem SQL verwende, arbeitet in meiner DB, aber nicht im Projekt? Warum müssen Sie eine Methode verwenden, die das Kennwort aus der SQL-Abfrage codiert und entschlüsselt? – tina

Verwandte Themen