resource page example java spring spring-security spring-boot oauth-2.0

java - page - Credenciales de Spring Boot+Oauth2



spring security 5 oauth2 example (2)

Tenemos servicios REST protegidos con el esquema de credenciales de Oauth2 Client. El servicio de recursos y autorizaciones se ejecuta en la misma aplicación, pero se puede dividir en diferentes aplicaciones.

@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); } } }

Configuración del origen de datos para las tablas Oauth2:

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

La comunicación con la autenticación y el servidor de recursos sigue el mismo procedimiento

curl -H "Accept: application/json" user:password@localhost:8080/oauth/token -d grant_type=client_credentials curl -H "Authorization: Bearer token" localhost:8080/...

El siguiente registro está presente en la base de datos Oauth2:

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 configuración en la aplicación del cliente

@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; } }

Puede inyectar el resto de la plantilla para hablar (de forma asincrónica) con el servicio seguro de Oauth2. No usamos el alcance en este momento.

Estoy tratando de proteger mis microservicios en Spring Boot usando Oath2 con flujo de credenciales de cliente.

Por cierto, esos microservicios solo se comunicarán entre sí sobre la capa de middleware, es decir, no se necesitan credenciales de usuario para permitir la autorización (proceso de inicio de sesión de usuario como Facebook).

He buscado muestras en Internet que muestran cómo crear una autorización y un servidor de recursos para administrar esta comunicación. Sin embargo, acabo de encontrar ejemplos que explican cómo hacerlo usando credenciales de usuario (tres patas).

¿Alguien tiene alguna muestra de cómo hacerlo en Spring Boot y Oauth2? Si es posible dar más detalles sobre los ámbitos utilizados, el intercambio de fichas sería agradecido.