J'ai une application Spring Boot 1.3.0 avec Spring Security OAuth incluse comme une sorte d'intégration SSO.
Le problème est que l'application s'exécute dans un environnement non SSL avec un port non standard derrière un équilibreur de charge (F5) qui force SSL et le fournisseur OAuth exige que toutes les URL de redirection soient enregistrées en tant que https, mais le client Spring OAuth (auto -configured with @EnableOAuthSso) ne redirigera que vers le fournisseur OAuth avec l'URL suivante ...
https: // [hôte_fournisseur]/oauth/authorize? client_id = [éditer]& redirect_uri = http: // [hôte_application]/login & type_réponse = code & scope = [rédiger] & state = IpMYTe
Notez que le retour redirect_uri est généré en tant que http. Même si le F5 le forcera à https au retour, notre fournisseur OAuth n'autorisera pas l'URI de redirection non SSL. Comment puis-je configurer cela?
À l'exception de mes contrôleurs Spring Data JPA, voici l'intégralité de l'application ...
@SpringBootApplication(exclude = { HibernateJpaAutoConfiguration.class })
@EnableJpaRepositories
public class AppConfig extends SpringBootServletInitializer {
public static void main(final String... args) {
SpringApplication.run(AppConfig.class, args);
}
@Autowired
public DataSource dataSource;
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean getEntityManagerFactoryInfo() {
final LocalContainerEntityManagerFactoryBean fac = new LocalContainerEntityManagerFactoryBean();
fac.setDataSource(dataSource);
fac.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
fac.setPackagesToScan("[redact]");
final Properties props = new Properties();
props.put("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");
props.put("hibernate.show_sql", "true");
props.put("hibernate.format_sql", "true");
fac.setJpaProperties(props);
return fac;
}
@Bean(name = "transactionManager")
public PlatformTransactionManager getTransactionManager() {
final JpaTransactionManager transactMngr = new JpaTransactionManager();
transactMngr.setEntityManagerFactory(getEntityManagerFactoryInfo().getObject());
return transactMngr;
}
}
@Configuration
@EnableOAuth2Sso
public class SecurityConfig {
}
server.port=9916
server.contextPath=
server.use-forward-headers=true
security.oauth2.client.clientId=[redact]
security.oauth2.client.clientSecret=[redact]
security.oauth2.client.scope=[redact]
security.oauth2.client.accessTokenUri=https://[provider_Host]/oauth/token
security.oauth2.client.userAuthorizationUri=https://[provider_Host]/oauth/authorize
security.oauth2.resource.userInfoUri=https://[provider_Host]/oauth/me
security.oauth2.resource.preferTokenInfo=false
logging.level.org.springframework=TRACE
Après avoir fouillé manuellement dans les classes de configuration, j'ai pu trouver et ajouter ce qui suit, ce qui a fait l'affaire ...
security.oauth2.client.pre-established-redirect-uri=https://[application_Host]/login
security.oauth2.client.registered-redirect-uri=https://[application_Host]/login
security.oauth2.client.use-current-uri=false
Je ne suis pas convaincu qu'il n'existe pas de meilleur moyen de résoudre le problème du forçage d'une URL de redirection HTTPS, mais ce correctif a fonctionné pour moi.
Vous devrez peut-être vous assurer que votre application comprend les en-têtes x-forwarded
de votre équilibreur de charge.
Mettre ceci dans mon application.yml corrige mon problème très similaire avec une application derrière un AWB ELB:
server:
Tomcat:
remote-ip-header: x-forwarded-for
protocol-header: x-forwarded-proto
Edit: Ceci peut être simplifié avec la configuration plus générique:
server:
use-forward-headers: true
J'ai eu le même problème ... J'ai ajouté ces deux paramètres pour forcer HTTPS dans redirect_uri
preEstablishedRedirectUri: https://...
useCurrentUri: false
Cela fonctionne: "redirect_uri" utilise maintenant HTTPS
vous devrez peut-être utiliser spring.oauth2.client.access-token-uri
paramètre de configuration modifié après 1.3.0.M1
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3.0-M1-Configuration-Changelog