2016-05-30 16 views
13

Ich versuche, meine Microservices auf Spring Boot mit Oath2 mit Client-Anmeldeinformationen fließen zu schützen.Spring Boot + Oauth2 Client-Anmeldeinformationen

Übrigens, diese Microservices werden nur über die Middleware-Ebene miteinander kommunizieren, ich meine, dass keine Benutzerdaten benötigt werden, um die Autorisierung zu erlauben (Benutzeranmeldung als Facebook).

Ich habe im Internet nach Beispielen gesucht, die zeigen, wie man einen Autorisierungs- und Ressourcenserver erstellt, um diese Kommunikation zu verwalten. Ich habe jedoch nur Beispiele gefunden, die erklären, wie man Benutzeranmeldeinformationen (drei Beine) verwendet.

Hat jemand irgendeine Probe, wie man es in Spring Boot und Oauth2 macht? Wenn es möglich ist, weitere Details zu den verwendeten Scopes anzugeben, wäre der Token-Austausch dankbar.

Antwort

14

Wir haben REST-Dienste, die mit dem Oauth2-Client-Berechtigungsschema geschützt sind. Der Ressourcen- und Autorisierungsdienst wird in derselben App ausgeführt, kann jedoch in verschiedene Apps aufgeteilt werden.

@Configuration 
public class SecurityConfig { 

@Configuration 
@EnableResourceServer 
protected static class ResourceServer extends ResourceServerConfigurerAdapter { 

    // Identifies this resource server. Usefull if the AuthorisationServer authorises multiple Resource servers 
    private static final String RESOURCE_ID = "*****"; 

    @Resource(name = "OAuth") 
    @Autowired 
    DataSource dataSource; 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     // @formatter:off 
     http  
       .authorizeRequests().anyRequest().authenticated(); 
     // @formatter:on 
    } 

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

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

@Configuration 
@EnableAuthorizationServer 
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { 

    @Resource(name = "OAuth") 
    @Autowired 
    DataSource dataSource; 

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

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

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.jdbc(dataSource); 
    } 
} 
} 

Datenquelle Config für die OAuth2 Tabellen:

@Bean(name = "OAuth") 
@ConfigurationProperties(prefix="datasource.oauth") 
public DataSource secondaryDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

Kommunikation mit Authentifizierung & Ressource-Server geht als

curl -H "Accept: application/json" user:[email protected]:8080/oauth/token -d grant_type=client_credentials 
curl -H "Authorization: Bearer token" localhost:8080/... 
gefolgt

Der folgende Eintrag in der OAuth2 Datenbank vorhanden ist:

client_id resource_ids client_secret scope authorized_grant_types web_server_redirect_uri authorities access_token_validity refresh_token_validity additional_information autoapprove 
user **** password NULL client_credentials NULL X NULL NULL NULL NULL 

Resttemplate Konfiguration in Client-Anwendung

@Configuration 
@EnableOAuth2Client 
public class OAuthConfig { 

@Value("${OAuth2ClientId}") 
private String oAuth2ClientId; 

@Value("${OAuth2ClientSecret}") 
private String oAuth2ClientSecret; 

@Value("${Oauth2AccesTokenUri}") 
private String accessTokenUri; 

@Bean 
public RestTemplate oAuthRestTemplate() { 
    ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails(); 
    resourceDetails.setId("1"); 
    resourceDetails.setClientId(oAuth2ClientId); 
    resourceDetails.setClientSecret(oAuth2ClientSecret); 
    resourceDetails.setAccessTokenUri(accessTokenUri); 

    /* 

    When using @EnableOAuth2Client spring creates a OAuth2ClientContext for us: 

    "The OAuth2ClientContext is placed (for you) in session scope to keep the state for different users separate. 
    Without that you would have to manage the equivalent data structure yourself on the server, 
    mapping incoming requests to users, and associating each user with a separate instance of the OAuth2ClientContext." 
    (http://projects.spring.io/spring-security-oauth/docs/oauth2.html#client-configuration) 

    Internally the SessionScope works with a threadlocal to store variables, hence a new thread cannot access those. 
    Therefore we can not use @Async 

    Solution: create a new OAuth2ClientContext that has no scope. 
    *Note: this is only safe when using client_credentials as OAuth grant type! 

    */ 

//  OAuth2RestTemplate restTemplate = new  OAuth2RestTemplate(resourceDetails, oauth2ClientContext); 
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails, new DefaultOAuth2ClientContext()); 

    return restTemplate; 
} 
} 

Sie die restTemplate injizieren (Asynchron) an die OAuth2 gesicherten Service zu sprechen. Wir verwenden im Moment kein Oszilloskop.

+1

Wirklich netter Code, ich werde es ausprobieren. –

+0

Gibt es eine andere Möglichkeit, anstatt die Daten mit @value zu ziehen und oauthRestTemplate einzurichten? – Jesse

+0

@CarlosAlberto Hallo, haben Sie das ganze Projekt dafür. Ich brauche das Gleiche. – noobdeveloper

Verwandte Themen