17

Sto seguendo l'esempio di base Primavera Boot OAuth2 da Dave Syer: https://github.com/dsyer/sparklr-boot/blob/master/src/main/java/demo/Application.javaCome ottenere primavera avvio e l'esempio OAuth2 di utilizzare le credenziali di password di concedere ad altri quello predefinito

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
@RestController 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @RequestMapping("/") 
    public String home() { 
     return "Hello World"; 
    } 

    @Configuration 
    @EnableResourceServer 
    protected static class ResourceServer extends ResourceServerConfigurerAdapter { 

     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      // @formatter:off 
      http 
       // Just for laughs, apply OAuth protection to only 2 resources 
       .requestMatchers().antMatchers("/","/admin/beans").and() 
       .authorizeRequests() 
       .anyRequest().access("#oauth2.hasScope('read')"); 
      // @formatter:on 
     } 

     @Override 
     public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
      resources.resourceId("sparklr"); 
     } 

    } 

    @Configuration 
    @EnableAuthorizationServer 
    protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { 

     @Autowired 
     private AuthenticationManager authenticationManager; 

     @Override 
     public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
      endpoints.authenticationManager(authenticationManager); 
     } 

     @Override 
     public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
      // @formatter:off 
      clients.inMemory() 
       .withClient("my-trusted-client") 
        .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit") 
        .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT") 
        .scopes("read", "write", "trust") 
        .resourceIds("sparklr") 
        .accessTokenValiditySeconds(60) 
      .and() 
       .withClient("my-client-with-registered-redirect") 
        .authorizedGrantTypes("authorization_code") 
        .authorities("ROLE_CLIENT") 
        .scopes("read", "trust") 
        .resourceIds("sparklr") 
        .redirectUris("http://anywhere?key=value") 
      .and() 
       .withClient("my-client-with-secret") 
        .authorizedGrantTypes("client_credentials", "password") 
        .authorities("ROLE_CLIENT") 
        .scopes("read") 
        .resourceIds("sparklr") 
        .secret("secret"); 
     // @formatter:on 
     } 

    } 
} 

L'esempio funziona molto bene per entrambi i tipi di concessioni, ma la concessione della password utilizza l'utente di sicurezza predefinito di Avvio a molla (quello che echo è "Utilizzo della password di sicurezza predefinita: 927ca0a0-634a-4671-bd1c-1323a866618a" durante l'avvio).

La mia domanda è come si sostituisce l'account utente predefinito e si basa effettivamente su WebSecurityConfig? Ho aggiunto una sezione come questa:

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
protected static class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(AuthenticationManagerBuilder authManagerBuilder) 
      throws Exception { 
     authManagerBuilder.inMemoryAuthentication().withUser("user") 
       .password("password").roles("USER"); 
    } 
} 

Ma non sembra ignorare l'impostazione predefinita Primavera utente/password, anche se la documentazione suggerisce che si dovrebbe.

Cosa mi manca per funzionare?

+0

No, non dovrebbe a meno che non aggiungere '@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER)' ad esso. È possibile impostare il nome utente/password predefiniti nel file application.properties impostando le proprietà 'security.user.name' e' security.user.password'. Per ulteriori proprietà consultare la [guida di riferimento] (http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html). –

+0

C'è un esempio migliore (più aggiornato) qui: https://github.com/spring-projects/spring-security-oauth/blob/master/tests/annotation/jdbc/src/main/java/demo/Application .java # L81. Quel metodo 'authenticationManager' è un nuovo override nelle istantanee 2.0.4 (guarda l'implementazione se vuoi usarlo con 2.0.3). –

+0

@DaveSyer l'esempio non è stato eseguito per me, "Errore durante la creazione di bean con nome 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration'" –

risposta

7
@Configuration 
protected static class AuthenticationManagerConfiguration extends GlobalAuthenticationConfigurerAdapter { 

     @Override 
     public void init(AuthenticationManagerBuilder auth) throws Exception { 
      auth.inMemoryAuthentication().withUser("min").password("min").roles("USER"); 
     } 

    } 
+0

Sì, questa è una soluzione molto più bella di quella che dovevo usare in 2.0.3. –

6

Come Sono ancora in 2.0.3, ho provato un paio di cose e questo sembra funzionare:

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
protected static class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception { 
     authManagerBuilder 
      .inMemoryAuthentication() 
       .withUser("user1").password("password1").roles("USER").and() 
       .withUser("admin1").password("password1").roles("ADMIN"); 
    } 

    @Bean 
    @Override 
    public AuthenticationManager authenticationManager() throws Exception { 
     return super.authenticationManager(); 
    } 
} 

Definendo in modo esplicito il fagiolo AuthenticationManager, l'autenticazione utente built-in è andato via e ha iniziato a fare affidamento sul mio inMemoryAuthentication. Quando verrà rilasciato 2.0.4, rivaluterò la soluzione che Dave ha postato sopra in quanto sembra più elegante.

+0

Penso che questa soluzione sia più adatta quando devi configurare pagine statiche all'interno del tuo server OAuth e devono essere pubbliche. È possibile sovrascrivere 'configure (HttpSecurity http)' e 'configure (WebSecurity web)' e definire specifici 'antMatchers' a tale scopo. –

+0

Sai come memorizzare gli utenti in un database e controllare le loro credenziali a questo punto? – Marcel

+0

Saluti !!! La soluzione di cui sopra funziona kudos @shawn – Harleen

3

L'esempio indicato sopra -
https://github.com/dsyer/sparklr-boot/blob/master/src/main/java/demo/Application.java
è per Spring 1.3

Se utilizza Spring 1.5 e superiori (che di solito è caso ora) necessità di aggiungere una proprietà aggiuntiva.

Come altri hanno fatto notare che possiamo usare il

@Configuration 
@EnableWebSecurity 
public class EmployeeSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/resources/**"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/user/getEmployeesList") 
      .hasAnyRole("ADMIN").anyRequest().authenticated().and().formLogin() 
      .permitAll().and().logout().permitAll(); 

     http.csrf().disable(); 
    } 

    @Override 
    public void configure(AuthenticationManagerBuilder authenticationMgr) throws Exception { 
     authenticationMgr.inMemoryAuthentication().withUser("javainuse").password("javainuse") 
      .authorities("ROLE_ADMIN"); 
    } 
} 

punto importante è se si utilizza Primavera Boot 1.5 e superiori inoltre necessario aggiungere la seguente proprietà -

security.oauth2.resource.filter-order = 3 

fronte un sacco di problema cercando di identificare questo. trovato anche un buon riferimento per l'istruzione problema di cui sopra - Spring Boot + OAuth2 Example