2016-04-06 11 views
0

Ich benutze Spring Boot-Anwendung und ich habe Ruhe-Controller. Ich habe gerade im Frühling begonnen, OAuth 2.0 zu verwenden, um meine APIs zu sichern. Hier sind die Konfigurationsklassen, die ich habe.Wie passt man den OAuth-Service-Provider im Frühling an?

@Configuration 
@EnableResourceServer 
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter { 

    private static final String HU_REST_RESOURCE_ID = "rest_api"; 

    @Autowired 
    DataSource dataSource; 

    @Bean 
    public TokenStore tokenStore() { 
     return new JdbcTokenStore(dataSource); 
    } 


    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) { 
     resources.resourceId(HU_REST_RESOURCE_ID).stateless(false); 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 

    //define URL patterns to enable OAuth2 security 

     http. 
     requestMatchers().antMatchers("/user/**").and(). 
     authorizeRequests().antMatchers("/user/**").access("#oauth2.hasScope('read') or (!#oauth2.isOAuth() and hasRole('ROLE_USER'))"); 
    } 

} 

@Configuration 
@EnableAuthorizationServer 
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 


    @Autowired 
    DataSource dataSource; 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 


    clients.inMemory() 
       .withClient("my-trusted-client") 
       .authorizedGrantTypes("password","refresh_token") 
       .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT") 
       .scopes("read", "write", "trust") 
       .accessTokenValiditySeconds(60) 
       .refreshTokenValiditySeconds(600) 
     .and() 
       .withClient("my-trusted-client-with-secret") 
       .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit") 
       .authorities("ROLE_USER") 
       .scopes("read", "write", "trust") 
       .accessTokenValiditySeconds(60) 
       .refreshTokenValiditySeconds(600); 
    } 


    @Bean 
    public TokenStore tokenStore() { 
     return new JdbcTokenStore(dataSource); // access and refresh tokens will be maintain in database 
    } 

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

    } 

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
     oauthServer.allowFormAuthenticationForClients(); 
    } 

} 


@Configuration 
public class GlobalAuthenticationConfig extends GlobalAuthenticationConfigurerAdapter { 

    @Override 
    public void init(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("user1").password("user1123").roles("USER"); 
     auth.inMemoryAuthentication().withUser("user2").password("user2123").roles("ADMIN"); 
    } 
} 

jetzt, wenn ich die URL getroffen http://localhost:8080/oauth/token?grant_type=password&client_id=my-trusted-client-with-secret&username=user1&password=user1123 ich die folgenden Zugriffstoken und Token aktualisieren,

{ 
    "access_token": "87379d65-6012-4484-ba6f-e4c61766ede3", 
    "token_type": "bearer", 
    "refresh_token": "8b0d0ae3-0855-4465-9d89-a1c31c031b8a", 
    "expires_in": 59, 
    "scope": "read write trust" 
} 

Meine Frage, warum sollte jemand die Anmeldeinformationen als Abfrageparameter übergeben? Können wir eine Post-Anfrage machen und die benötigten Parameter in einem Objekt als POST-Anfrage senden? Wenn ja, wie kann ich es tun? Meine zweite Frage ist, hier verwende ich inmemory Authentifizierung, d. H. Zwei Benutzer sind im Code fest codiert. Wie kann ich sicherstellen, dass die Benutzerdaten von der Datenbank überprüft werden?

Antwort

0

Wenn Sie https (die Sie sollten) die komplette Abfrage, bevor sie durch das Netzwerk gesendet verschlüsselt werden, wie hier erklärt: Are querystring parameters secure in HTTPS (HTTP + SSL)?

In Bezug auf Ihre zweite Frage, wenn Sie Frühling die autorisierten Benutzer überprüfen möchten aus eine Datenbank, werden Sie eine Klasse erbt von UserDetailsManagerhttp://docs.spring.io/autorepo/docs/spring-security/4.0.3.RELEASE/apidocs/org/springframework/security/provisioning/UserDetailsManager.html

erstellen müssen können Sie dann ihre verschiedenen Methoden implementieren, die speziell loadUserByUsername(String username), dass es von UserDetailsService implementiert (die durch die Federauthentifizierungsmanager verwendet wird), mit Code, der abfragt Ihre Datenbank für die relevante Daten.

Diese andere Frage beschreibt, wie diese Manager auf Ihren Frühlings-Anwendung für Ihre Antwort How to make a UserDetailsManager available as a bean

+0

Sie hinzufügen danken. –

Verwandte Themen