Skip to content

Commit 93ca455

Browse files
committed
OAuth2LoginAuthenticationFilter ignores authenticated Users
This ensures that OAuth2 Client support works with the same log in URL as oauth2 login. Fixes: gh-5915
1 parent e804583 commit 93ca455

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2LoginConfigurer.java

+4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.security.core.Authentication;
2727
import org.springframework.security.core.AuthenticationException;
2828
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
29+
import org.springframework.security.core.context.SecurityContextHolder;
2930
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
3031
import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider;
3132
import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationToken;
@@ -428,6 +429,9 @@ public void init(B http) throws Exception {
428429
this.loginProcessingUrl);
429430
this.setAuthenticationFilter(authenticationFilter);
430431
super.loginProcessingUrl(this.loginProcessingUrl);
432+
RequestMatcher authenticationNullMatcher = request -> SecurityContextHolder.getContext().getAuthentication() == null;
433+
authenticationFilter.setRequiresAuthenticationRequestMatcher(new AndRequestMatcher(createLoginProcessingUrlMatcher(this.loginProcessingUrl),
434+
authenticationNullMatcher));
431435

432436
if (this.loginPage != null) {
433437
// Set custom login page

config/src/test/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2LoginConfigurerTests.java

+27
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.mock.web.MockFilterChain;
2828
import org.springframework.mock.web.MockHttpServletRequest;
2929
import org.springframework.mock.web.MockHttpServletResponse;
30+
import org.springframework.security.authentication.TestingAuthenticationToken;
3031
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
3132
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
3233
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@@ -35,6 +36,7 @@
3536
import org.springframework.security.core.GrantedAuthority;
3637
import org.springframework.security.core.authority.SimpleGrantedAuthority;
3738
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
39+
import org.springframework.security.core.context.SecurityContextImpl;
3840
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
3941
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
4042
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
@@ -154,6 +156,31 @@ public void oauth2Login() throws Exception {
154156
.isInstanceOf(OAuth2UserAuthority.class).hasToString("ROLE_USER");
155157
}
156158

159+
@Test
160+
public void oauth2LoginWhenAuthenticatedThenIgnored() throws Exception {
161+
// setup application context
162+
loadConfig(OAuth2LoginConfig.class);
163+
164+
// authenticate
165+
TestingAuthenticationToken expectedAuthentication = new TestingAuthenticationToken("a",
166+
"b", "ROLE_TEST");
167+
168+
this.request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, new SecurityContextImpl(expectedAuthentication));
169+
170+
// setup authentication parameters
171+
this.request.setParameter("code", "code123");
172+
this.request.setParameter("state", "state");
173+
174+
// perform test
175+
this.springSecurityFilterChain.doFilter(this.request, this.response, this.filterChain);
176+
177+
// assertions
178+
Authentication authentication = this.securityContextRepository
179+
.loadContext(new HttpRequestResponseHolder(this.request, this.response))
180+
.getAuthentication();
181+
assertThat(authentication).isEqualTo(expectedAuthentication);
182+
}
183+
157184
@Test
158185
public void oauth2LoginCustomWithConfigurer() throws Exception {
159186
// setup application context

0 commit comments

Comments
 (0)