2015-07-29 14 views
6

Voglio configurare il valore Autorizza richieste dal database all'avvio del server. Attualmente sto dando un valore di base nel file di classe Java, c'è un modo per leggere lo stesso dal database.Sicurezza di primavera Autorizza valore richieste dal database

Di seguito è riportato il codice di esempio:

protected void configure(HttpSecurity http) throws Exception { 
http 
    .authorizeRequests()                 
     .antMatchers("/resources/**", "/signup", "/about").permitAll()     
     .antMatchers("/admin/**").hasRole("ADMIN")          
     .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")    
     .anyRequest().authenticated()             
     .and() 
    // ... 
    .formLogin(); 
} 

Come leggere URL dal database per esempio:/admin/** dal database al posto del valore del codice duro nei file di classe

+0

e quale sarà il risultato desiderato se il database non è accessibile? – hovanessyan

risposta

3

È possibile utilizzare il supporto Spring JDBC . Prima di tutto è necessario impostare un database. Quindi, è possibile recuperare le righe e elaborarle in modo appropriato.

Si dovrebbe avere una tabella, in cui si dispone di righe e una colonna è riempita con /admin/** e /db/**. L'altra colonna deve essere riempita con le informazioni di accesso al ruolo. Successivamente, seguendo il tutorial, dovresti recuperare queste righe. Supponiamo che hai seguente classe entità:

class Matcher { 
    public String name; 
    public String roleInfo; 
} 

Quindi, è possibile scorrere i Matcher entità per la configurazione:

http.authorizeRequests() 
      .antMatchers("/resources/**", "/signup", "/about").permitAll(); 

    for (Matcher matcher : matchers) { 
     http.authorizeRequests().antMatchers(matcher.name).access(matcher.roleInfo); 
    } 
    http.authorizeRequests().anyRequest().authenticated() 
      .and() 
        // ... 
      .formLogin(); 
+0

Ho già una configurazione del database. Come posso assegnare valore ad antMatcher dal database invece del codice duro in classe. Se mi manca qualcosa per favore dimmi che tipo di configurazione del database vuoi che faccia. – pise

+0

@pise Ho aggiornato la risposta. – mtyurt

+0

così mentre il server si avvia devo leggere il valore del database e poi iterare? – pise

0

Ho avuto lo stesso problema. Nel mio caso per un ruolo ho assegnato diversi percorsi. Qualcuno potrebbe averne bisogno. Va notato che prendo come riferimento la risposta @mtyurt. Il modo ho risolto era la seguente:

List<Role> roles = roleRepository.findAll(); 
for (Role role : roles 
     ) { 
    List<Page> pages = pageRepository.findPagesPerRole(role.getId()); 
    List<String> pageslist = new ArrayList<>(); 
    for (Page page : pages 
     ) { 
     pageslist.add(page.getUrl()); 
    } 
    String[] authorities = pageslist.toArray(new String[0]); 
    http.authorizeRequests().antMatchers(authorities).hasAuthority(role.getAuthority().toString()); 
} 

Ho una table dove tengo le percorsi e un'altra dove tengo il roles. Nei ruoli posso assegnare pagine a te e una pagina può essere in diversi ruoli, quindi viene generata una tabella many-to-many. Da SQL ho ottenuto l'elenco dei percorsi assegnati a un ruolo. Ecco perché faccio due cicli. Quindi, infine, a http I assegno un array di strings e il nome del ruolo.

Problemi correlati