Skip to content

Commit 479d2bc

Browse files
author
sdratler1
committed
2 parents 1fa8a4b + 3d9de9b commit 479d2bc

File tree

102 files changed

+4883
-1086
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

102 files changed

+4883
-1086
lines changed

.github/workflows/pr-build-workflow.yml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
name: PR Build
22

3-
on:
4-
pull_request:
5-
branches:
6-
- master
3+
on: pull_request
74

85
jobs:
96
build:

.travis.yml

Lines changed: 0 additions & 16 deletions
This file was deleted.

Jenkinsfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ try {
8989
"GRADLE_ENTERPRISE_CACHE_USERNAME=${GRADLE_ENTERPRISE_CACHE_USERNAME}",
9090
"GRADLE_ENTERPRISE_CACHE_PASSWORD=${GRADLE_ENTERPRISE_CACHE_PASSWORD}",
9191
"GRADLE_ENTERPRISE_ACCESS_KEY=${GRADLE_ENTERPRISE_ACCESS_KEY}"]) {
92-
sh "./gradlew test -PforceMavenRepositories=snapshot -PspringVersion='5.+' -PreactorVersion=Dysprosium-BUILD-SNAPSHOT -PspringDataVersion=Lovelace-BUILD-SNAPSHOT -PlocksDisabled --stacktrace"
92+
sh "./gradlew test -PforceMavenRepositories=snapshot -PspringVersion='5.+' -PreactorVersion=20+ -PspringDataVersion=Lovelace-BUILD-SNAPSHOT -PrsocketVersion=1.1.0-SNAPSHOT -PlocksDisabled --stacktrace"
9393
}
9494
}
9595
} catch(Exception e) {

README.adoc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
image::https://badges.gitter.im/Join%20Chat.svg[Gitter,link=https://gitter.im/spring-projects/spring-security?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge]
22

3-
image:https://travis-ci.org/spring-projects/spring-security.svg?branch=master["Build Status", link="https://travis-ci.org/spring-projects/spring-security"]
4-
53
= Spring Security
64

75
Spring Security provides security services for the https://docs.spring.io[Spring IO Platform]. Spring Security 5.0 requires Spring 5.0 as

acl/src/main/java/org/springframework/security/acls/jdbc/JdbcAclService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package org.springframework.security.acls.jdbc;
1717

1818
import java.io.Serializable;
19-
import java.util.Arrays;
19+
import java.util.Collections;
2020
import java.util.List;
2121
import java.util.Map;
2222

@@ -99,7 +99,7 @@ public List<ObjectIdentity> findChildren(ObjectIdentity parentIdentity) {
9999
return new ObjectIdentityImpl(javaType, identifier);
100100
});
101101

102-
if (objects.size() == 0) {
102+
if (objects.isEmpty()) {
103103
return null;
104104
}
105105

@@ -108,7 +108,7 @@ public List<ObjectIdentity> findChildren(ObjectIdentity parentIdentity) {
108108

109109
public Acl readAclById(ObjectIdentity object, List<Sid> sids)
110110
throws NotFoundException {
111-
Map<ObjectIdentity, Acl> map = readAclsById(Arrays.asList(object), sids);
111+
Map<ObjectIdentity, Acl> map = readAclsById(Collections.singletonList(object), sids);
112112
Assert.isTrue(map.containsKey(object),
113113
() -> "There should have been an Acl entry for ObjectIdentity " + object);
114114

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
buildscript {
22
dependencies {
3-
classpath 'io.spring.gradle:spring-build-conventions:0.0.32.RELEASE'
3+
classpath 'io.spring.gradle:spring-build-conventions:0.0.33.RELEASE'
44
classpath "org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion"
55
classpath 'io.spring.nohttp:nohttp-gradle:0.0.5.RELEASE'
66
classpath "io.freefair.gradle:aspectj-plugin:5.0.1"

config/src/main/java/org/springframework/security/config/annotation/web/configuration/OAuth2ClientConfiguration.java

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2019 the original author or authors.
2+
* Copyright 2002-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
2020
import org.springframework.context.annotation.Import;
2121
import org.springframework.context.annotation.ImportSelector;
2222
import org.springframework.core.type.AnnotationMetadata;
23+
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
2324
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider;
2425
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder;
2526
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
@@ -33,7 +34,6 @@
3334
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
3435

3536
import java.util.List;
36-
import java.util.Optional;
3737

3838
/**
3939
* {@link Configuration} for OAuth 2.0 Client support.
@@ -67,47 +67,69 @@ static class OAuth2ClientWebMvcSecurityConfiguration implements WebMvcConfigurer
6767
private ClientRegistrationRepository clientRegistrationRepository;
6868
private OAuth2AuthorizedClientRepository authorizedClientRepository;
6969
private OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest> accessTokenResponseClient;
70+
private OAuth2AuthorizedClientManager authorizedClientManager;
7071

7172
@Override
7273
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
73-
if (this.clientRegistrationRepository != null && this.authorizedClientRepository != null) {
74-
OAuth2AuthorizedClientProviderBuilder authorizedClientProviderBuilder =
75-
OAuth2AuthorizedClientProviderBuilder.builder()
76-
.authorizationCode()
77-
.refreshToken()
78-
.password();
79-
if (this.accessTokenResponseClient != null) {
80-
authorizedClientProviderBuilder.clientCredentials(configurer ->
81-
configurer.accessTokenResponseClient(this.accessTokenResponseClient));
82-
} else {
83-
authorizedClientProviderBuilder.clientCredentials();
84-
}
85-
OAuth2AuthorizedClientProvider authorizedClientProvider = authorizedClientProviderBuilder.build();
86-
DefaultOAuth2AuthorizedClientManager authorizedClientManager = new DefaultOAuth2AuthorizedClientManager(
87-
this.clientRegistrationRepository, this.authorizedClientRepository);
88-
authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
74+
OAuth2AuthorizedClientManager authorizedClientManager = getAuthorizedClientManager();
75+
if (authorizedClientManager != null) {
8976
argumentResolvers.add(new OAuth2AuthorizedClientArgumentResolver(authorizedClientManager));
9077
}
9178
}
9279

9380
@Autowired(required = false)
94-
public void setClientRegistrationRepository(List<ClientRegistrationRepository> clientRegistrationRepositories) {
81+
void setClientRegistrationRepository(List<ClientRegistrationRepository> clientRegistrationRepositories) {
9582
if (clientRegistrationRepositories.size() == 1) {
9683
this.clientRegistrationRepository = clientRegistrationRepositories.get(0);
9784
}
9885
}
9986

10087
@Autowired(required = false)
101-
public void setAuthorizedClientRepository(List<OAuth2AuthorizedClientRepository> authorizedClientRepositories) {
88+
void setAuthorizedClientRepository(List<OAuth2AuthorizedClientRepository> authorizedClientRepositories) {
10289
if (authorizedClientRepositories.size() == 1) {
10390
this.authorizedClientRepository = authorizedClientRepositories.get(0);
10491
}
10592
}
10693

107-
@Autowired
108-
public void setAccessTokenResponseClient(
109-
Optional<OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest>> accessTokenResponseClient) {
110-
accessTokenResponseClient.ifPresent(client -> this.accessTokenResponseClient = client);
94+
@Autowired(required = false)
95+
void setAccessTokenResponseClient(OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest> accessTokenResponseClient) {
96+
this.accessTokenResponseClient = accessTokenResponseClient;
97+
}
98+
99+
@Autowired(required = false)
100+
void setAuthorizedClientManager(List<OAuth2AuthorizedClientManager> authorizedClientManagers) {
101+
if (authorizedClientManagers.size() == 1) {
102+
this.authorizedClientManager = authorizedClientManagers.get(0);
103+
}
104+
}
105+
106+
private OAuth2AuthorizedClientManager getAuthorizedClientManager() {
107+
if (this.authorizedClientManager != null) {
108+
return this.authorizedClientManager;
109+
}
110+
111+
OAuth2AuthorizedClientManager authorizedClientManager = null;
112+
if (this.clientRegistrationRepository != null && this.authorizedClientRepository != null) {
113+
if (this.accessTokenResponseClient != null) {
114+
OAuth2AuthorizedClientProvider authorizedClientProvider =
115+
OAuth2AuthorizedClientProviderBuilder.builder()
116+
.authorizationCode()
117+
.refreshToken()
118+
.clientCredentials(configurer ->
119+
configurer.accessTokenResponseClient(this.accessTokenResponseClient))
120+
.password()
121+
.build();
122+
DefaultOAuth2AuthorizedClientManager defaultAuthorizedClientManager =
123+
new DefaultOAuth2AuthorizedClientManager(
124+
this.clientRegistrationRepository, this.authorizedClientRepository);
125+
defaultAuthorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
126+
authorizedClientManager = defaultAuthorizedClientManager;
127+
} else {
128+
authorizedClientManager = new DefaultOAuth2AuthorizedClientManager(
129+
this.clientRegistrationRepository, this.authorizedClientRepository);
130+
}
131+
}
132+
return authorizedClientManager;
111133
}
112134
}
113135
}

config/src/main/java/org/springframework/security/config/http/AuthenticationConfigBuilder.java

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,8 @@
1515
*/
1616
package org.springframework.security.config.http;
1717

18-
import java.security.SecureRandom;
19-
import java.util.ArrayList;
20-
import java.util.Collections;
21-
import java.util.List;
22-
import java.util.Map;
23-
import java.util.function.Function;
24-
import javax.servlet.http.HttpServletRequest;
25-
2618
import org.apache.commons.logging.Log;
2719
import org.apache.commons.logging.LogFactory;
28-
import org.w3c.dom.Element;
29-
3020
import org.springframework.beans.BeanMetadataElement;
3121
import org.springframework.beans.factory.config.BeanDefinition;
3222
import org.springframework.beans.factory.config.BeanReference;
@@ -63,8 +53,18 @@
6353
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
6454
import org.springframework.security.web.csrf.CsrfToken;
6555
import org.springframework.util.Assert;
56+
import org.springframework.util.ClassUtils;
6657
import org.springframework.util.StringUtils;
6758
import org.springframework.util.xml.DomUtils;
59+
import org.w3c.dom.Element;
60+
61+
import javax.servlet.http.HttpServletRequest;
62+
import java.security.SecureRandom;
63+
import java.util.ArrayList;
64+
import java.util.Collections;
65+
import java.util.List;
66+
import java.util.Map;
67+
import java.util.function.Function;
6868

6969
import static org.springframework.security.config.http.SecurityFilters.ANONYMOUS_FILTER;
7070
import static org.springframework.security.config.http.SecurityFilters.BASIC_AUTH_FILTER;
@@ -160,12 +160,16 @@ final class AuthenticationConfigBuilder {
160160

161161
private String openIDLoginPage;
162162

163+
private boolean oauth2LoginEnabled;
164+
private boolean defaultAuthorizedClientRepositoryRegistered;
163165
private String oauth2LoginFilterId;
164166
private BeanDefinition oauth2AuthorizationRequestRedirectFilter;
165167
private BeanDefinition oauth2LoginEntryPoint;
166168
private BeanReference oauth2LoginAuthenticationProviderRef;
167169
private BeanReference oauth2LoginOidcAuthenticationProviderRef;
168170
private BeanDefinition oauth2LoginLinks;
171+
172+
private boolean oauth2ClientEnabled;
169173
private BeanDefinition authorizationRequestRedirectFilter;
170174
private BeanDefinition authorizationCodeGrantFilter;
171175
private BeanReference authorizationCodeAuthenticationProviderRef;
@@ -196,8 +200,7 @@ final class AuthenticationConfigBuilder {
196200
createBasicFilter(authenticationManager);
197201
createBearerTokenAuthenticationFilter(authenticationManager);
198202
createFormLoginFilter(sessionStrategy, authenticationManager);
199-
createOAuth2LoginFilter(sessionStrategy, authenticationManager);
200-
createOAuth2ClientFilter(requestCache, authenticationManager);
203+
createOAuth2ClientFilters(sessionStrategy, requestCache, authenticationManager);
201204
createOpenIDLoginFilter(sessionStrategy, authenticationManager);
202205
createX509Filter(authenticationManager);
203206
createJeeFilter(authenticationManager);
@@ -274,15 +277,27 @@ void createFormLoginFilter(BeanReference sessionStrategy, BeanReference authMana
274277
}
275278
}
276279

280+
void createOAuth2ClientFilters(BeanReference sessionStrategy, BeanReference requestCache,
281+
BeanReference authenticationManager) {
282+
createOAuth2LoginFilter(sessionStrategy, authenticationManager);
283+
createOAuth2ClientFilter(requestCache, authenticationManager);
284+
registerOAuth2ClientPostProcessors();
285+
}
286+
277287
void createOAuth2LoginFilter(BeanReference sessionStrategy, BeanReference authManager) {
278288
Element oauth2LoginElt = DomUtils.getChildElementByTagName(this.httpElt, Elements.OAUTH2_LOGIN);
279289
if (oauth2LoginElt == null) {
280290
return;
281291
}
292+
this.oauth2LoginEnabled = true;
282293

283294
OAuth2LoginBeanDefinitionParser parser = new OAuth2LoginBeanDefinitionParser(requestCache, portMapper,
284295
portResolver, sessionStrategy, allowSessionCreation);
285296
BeanDefinition oauth2LoginFilterBean = parser.parse(oauth2LoginElt, this.pc);
297+
298+
BeanDefinition defaultAuthorizedClientRepository = parser.getDefaultAuthorizedClientRepository();
299+
registerDefaultAuthorizedClientRepositoryIfNecessary(defaultAuthorizedClientRepository);
300+
286301
oauth2LoginFilterBean.getPropertyValues().addPropertyValue("authenticationManager", authManager);
287302

288303
// retrieve the other bean result
@@ -319,11 +334,15 @@ void createOAuth2ClientFilter(BeanReference requestCache, BeanReference authenti
319334
if (oauth2ClientElt == null) {
320335
return;
321336
}
337+
this.oauth2ClientEnabled = true;
322338

323339
OAuth2ClientBeanDefinitionParser parser = new OAuth2ClientBeanDefinitionParser(
324340
requestCache, authenticationManager);
325341
parser.parse(oauth2ClientElt, this.pc);
326342

343+
BeanDefinition defaultAuthorizedClientRepository = parser.getDefaultAuthorizedClientRepository();
344+
registerDefaultAuthorizedClientRepositoryIfNecessary(defaultAuthorizedClientRepository);
345+
327346
this.authorizationRequestRedirectFilter = parser.getAuthorizationRequestRedirectFilter();
328347
String authorizationRequestRedirectFilterId = pc.getReaderContext()
329348
.generateBeanName(this.authorizationRequestRedirectFilter);
@@ -344,6 +363,28 @@ void createOAuth2ClientFilter(BeanReference requestCache, BeanReference authenti
344363
this.authorizationCodeAuthenticationProviderRef = new RuntimeBeanReference(authorizationCodeAuthenticationProviderId);
345364
}
346365

366+
void registerDefaultAuthorizedClientRepositoryIfNecessary(BeanDefinition defaultAuthorizedClientRepository) {
367+
if (!this.defaultAuthorizedClientRepositoryRegistered && defaultAuthorizedClientRepository != null) {
368+
String authorizedClientRepositoryId = pc.getReaderContext()
369+
.generateBeanName(defaultAuthorizedClientRepository);
370+
this.pc.registerBeanComponent(new BeanComponentDefinition(
371+
defaultAuthorizedClientRepository, authorizedClientRepositoryId));
372+
this.defaultAuthorizedClientRepositoryRegistered = true;
373+
}
374+
}
375+
376+
private void registerOAuth2ClientPostProcessors() {
377+
if (!this.oauth2LoginEnabled && !this.oauth2ClientEnabled) {
378+
return;
379+
}
380+
381+
boolean webmvcPresent = ClassUtils.isPresent("org.springframework.web.servlet.DispatcherServlet", getClass().getClassLoader());
382+
if (webmvcPresent) {
383+
this.pc.getReaderContext().registerWithGeneratedName(
384+
new RootBeanDefinition(OAuth2ClientWebMvcSecurityPostProcessor.class));
385+
}
386+
}
387+
347388
void createOpenIDLoginFilter(BeanReference sessionStrategy, BeanReference authManager) {
348389
Element openIDLoginElt = DomUtils.getChildElementByTagName(httpElt,
349390
Elements.OPENID_LOGIN);

0 commit comments

Comments
 (0)