2014-09-16 10 views
18

Sono riuscito a caricare tutti gli utenti in AuthenticationManagerBuilder durante il caricamento iniziale dell'applicazione, ma ho il requisito di aggiungere utenti post-avvio.Come posso aggiungere utenti al builder inMemoryAuthentication dopo che è stato creato?

Startup:

public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

... 

auth.inMemoryAuthentication().withUser(email).password(password).roles(roles.toArray(new String[roles.size()])).and().passwordEncoder(encoder()); 

Questa grande opera per un punto nel tempo, ma ho un caso d'uso in cui gli utenti possono essere aggiunti mentre l'applicazione è in esecuzione.

Con quale metodo è possibile eseguire questo post-avvio (tramite controller/servizio)? Sto pensando che potrebbe essere il InMemoryUserDetailsManager (contiene il metodo createUser()) ma non sono sicuro di come fare riferimento o configurarlo.

risposta

24

Il seguente codice farà quello che si sta chiedendo:

@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

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

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(inMemoryUserDetailsManager()); 
    } 

    @Bean 
    public InMemoryUserDetailsManager inMemoryUserDetailsManager() { 
     final Properties users = new Properties(); 
     users.put("user","pass,ROLE_USER,enabled"); //add whatever other user you need 
     return new InMemoryUserDetailsManager(users); 
    } 

} 

Utilizzando il InMemoryUserDetailsManager si è configurato di sopra di un super semplice controller che aggiunge semplicemente e verifica l'esistenza di un utente sarebbe simile:

@RestController 
@RequestMapping("user") 
public class SimpleSecurityController { 

    private final InMemoryUserDetailsManager inMemoryUserDetailsManager; 

    @Autowired 
    public SimpleSecurityController(InMemoryUserDetailsManager inMemoryUserDetailsManager) { 
     this.inMemoryUserDetailsManager = inMemoryUserDetailsManager; 
    } 

    @RequestMapping("exists/{username}") 
    public boolean userExists(@PathVariable("username") String username) { 
     return inMemoryUserDetailsManager.userExists(username); 
    } 

    @RequestMapping("add/{username}/{password}") 
    public String add(@PathVariable("username") String username, @PathVariable("password") String password) { 
     inMemoryUserDetailsManager.createUser(new User(username, password, new ArrayList<GrantedAuthority>())); 
     return "added"; 
    } 
} 

si noti inoltre che se si utilizza la configurazione automatica di primavera Boot è necessario aggiungere

@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class) 

per impedire primavera avvio dal tentativo di autoconfigure sicurezza

Aggiornamento Come notato da @AdamMichalik, @EnableWebMvcSecurity è deprecato e dovrebbe essere sostituito da @EnableWebSecurity

0

ho cambiato questo codice:

inMemoryUserDetailsManager.createUser(new User(username, password, new ArrayList<GrantedAuthority>())); 

dalla risposta di @ geoend a:

inMemoryUserDetailsManager.createUser(User.withUsername(username).password(password).roles("USER").build()); 

perché per impostazione predefinita, un nuovo utente non dispone di autorizzazioni.

Problemi correlati