Skip to content

Commit 86a28db

Browse files
author
Daniel Paniagua
committed
Added support of different servlet root paths for the Authn RequestFilter
1 parent d0d6ae2 commit 86a28db

File tree

4 files changed

+177
-3
lines changed

4 files changed

+177
-3
lines changed

openid-connect-server/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@
4747
<artifactId>spring-tx</artifactId>
4848
</dependency>
4949

50+
<dependency>
51+
<groupId>javax.servlet</groupId>
52+
<artifactId>javax.servlet-api</artifactId>
53+
<scope>test</scope>
54+
</dependency>
55+
5056
</dependencies>
5157
<description>OpenID Connect server libraries for Spring and Spring Security.</description>
5258
<url />

openid-connect-server/src/main/java/org/mitre/openid/connect/filter/AuthorizationRequestFilter.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* limitations under the License.
1616
*******************************************************************************/
1717
/**
18-
*
18+
*
1919
*/
2020
package org.mitre.openid.connect.filter;
2121

@@ -71,6 +71,7 @@ public class AuthorizationRequestFilter extends GenericFilterBean {
7171

7272
public final static String PROMPTED = "PROMPT_FILTER_PROMPTED";
7373
public final static String PROMPT_REQUESTED = "PROMPT_FILTER_REQUESTED";
74+
private static final String AUTHORIZE_URL = "/authorize";
7475

7576
@Autowired
7677
private OAuth2RequestFactory authRequestFactory;
@@ -85,7 +86,7 @@ public class AuthorizationRequestFilter extends GenericFilterBean {
8586
private LoginHintExtracter loginHintExtracter = new RemoveLoginHintsWithHTTP();
8687

8788
/**
88-
*
89+
*
8990
*/
9091
@Override
9192
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
@@ -95,7 +96,7 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
9596
HttpSession session = request.getSession();
9697

9798
// skip everything that's not an authorize URL
98-
if (!request.getServletPath().startsWith("/authorize")) {
99+
if (!isAuthorizeUrl(request)) {
99100
chain.doFilter(req, res);
100101
return;
101102
}
@@ -229,6 +230,22 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
229230
}
230231
}
231232

233+
/**
234+
* Checks is given request is a authentication request url
235+
*
236+
* @param request
237+
* @return
238+
*/
239+
private boolean isAuthorizeUrl(HttpServletRequest request) {
240+
if (AUTHORIZE_URL.equals(request.getPathInfo())) {
241+
return true;
242+
}
243+
if (request.getServletPath().startsWith(AUTHORIZE_URL)) {
244+
return true;
245+
}
246+
return false;
247+
}
248+
232249
/**
233250
* @param parameterMap
234251
* @return
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/*******************************************************************************
2+
* Copyright 2016 The MITRE Corporation
3+
* and the MIT Internet Trust Consortium
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*******************************************************************************/
17+
/**
18+
*
19+
*/
20+
package org.mitre.openid.connect.filter;
21+
22+
import org.junit.Before;
23+
import org.junit.Test;
24+
import org.mitre.oauth2.service.ClientDetailsEntityService;
25+
import org.mockito.*;
26+
import org.springframework.mock.web.MockHttpServletRequest;
27+
import org.springframework.security.oauth2.provider.AuthorizationRequest;
28+
import org.springframework.security.oauth2.provider.ClientDetails;
29+
import org.springframework.security.oauth2.provider.OAuth2RequestFactory;
30+
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
31+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
32+
33+
import javax.servlet.FilterChain;
34+
import javax.servlet.ServletRequest;
35+
import javax.servlet.ServletResponse;
36+
import java.util.Map;
37+
38+
import static org.hamcrest.CoreMatchers.equalTo;
39+
import static org.hamcrest.CoreMatchers.is;
40+
import static org.junit.Assert.assertThat;
41+
import static org.mockito.Matchers.any;
42+
import static org.mockito.Mockito.never;
43+
import static org.mockito.Mockito.times;
44+
45+
/**
46+
* @author dpaniagua
47+
*/
48+
public class AuthorizationRequestFilterTest {
49+
50+
@InjectMocks
51+
private AuthorizationRequestFilter authorizationRequestFilter;
52+
53+
@Mock
54+
private OAuth2RequestFactory oAuth2RequestFactory;
55+
56+
@Mock
57+
private ClientDetails clientDetails;
58+
59+
@Mock
60+
private ClientDetailsEntityService clientDetailsService;
61+
62+
@Mock
63+
private FilterChain springSecurityFilterChain;
64+
65+
@Mock
66+
AuthorizationRequest authorizationRequest;
67+
68+
ArgumentCaptor<Map> argumentCaptor;
69+
70+
@Before
71+
public void setUp() throws Exception {
72+
MockitoAnnotations.initMocks(this);
73+
argumentCaptor = ArgumentCaptor.forClass(Map.class);
74+
Mockito.when(oAuth2RequestFactory.createAuthorizationRequest(argumentCaptor.capture())).thenReturn
75+
(authorizationRequest);
76+
}
77+
78+
@Test()
79+
public void testDoFilter_outsideRootServletPath() throws Exception {
80+
81+
// given
82+
String baseUrl = "https://server.example.com/oidc/authorize";
83+
84+
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get(baseUrl);
85+
requestBuilder.servletPath("/oidc")
86+
.param("response_type", "code")
87+
.param("scope", "openid")
88+
.param("redirect_uri", "https://client.example.org/");
89+
MockHttpServletRequest request = requestBuilder.buildRequest(null);
90+
91+
//when
92+
authorizationRequestFilter.doFilter(request, null, springSecurityFilterChain);
93+
//then
94+
ArgumentCaptor<Map> argumentCaptor = ArgumentCaptor.forClass(Map.class);
95+
Mockito.verify(oAuth2RequestFactory, times(1)).createAuthorizationRequest(argumentCaptor.capture());
96+
Mockito.verify(springSecurityFilterChain, times(1)).doFilter(any(ServletRequest.class), any(ServletResponse
97+
.class));
98+
}
99+
100+
@Test()
101+
public void testDoFilter_RootServletPath() throws Exception {
102+
103+
// given
104+
// Values Taken from spec sample: http://openid.net/specs/openid-connect-core-1_0.html
105+
String baseUrl = "https://server.example.com/authorize";
106+
107+
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get(baseUrl);
108+
109+
requestBuilder.servletPath("/authorize")
110+
.param("response_type", "code")
111+
.param("scope", "openid")
112+
.param("redirect_uri", "https://client.example.org/");
113+
MockHttpServletRequest request = requestBuilder.buildRequest(null);
114+
115+
//when
116+
authorizationRequestFilter.doFilter(request, null, springSecurityFilterChain);
117+
118+
//then
119+
assertThat(request.getServletPath(), is(equalTo("/authorize")));
120+
Mockito.verify(oAuth2RequestFactory, times(1)).createAuthorizationRequest(any(Map.class));
121+
Mockito.verify(springSecurityFilterChain, times(1)).doFilter(any(ServletRequest.class), any(ServletResponse
122+
.class));
123+
}
124+
125+
@Test()
126+
public void testDoFilter_withInValidUrl() throws Exception {
127+
128+
// given
129+
String baseUrl = "https://server.example.com/authorize/something/else";
130+
131+
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get(baseUrl);
132+
requestBuilder.param("response_type", "code")
133+
.param("scope", "openid")
134+
.servletPath("/authorize")
135+
.param("redirect_uri", "https://client.example.org/");
136+
MockHttpServletRequest request = requestBuilder.buildRequest(null);
137+
138+
//when
139+
authorizationRequestFilter.doFilter(request, null, springSecurityFilterChain);
140+
141+
//then
142+
Mockito.verify(oAuth2RequestFactory, times(1)).createAuthorizationRequest(any(Map.class));
143+
Mockito.verify(springSecurityFilterChain, times(1)).doFilter(any(ServletRequest.class), any(ServletResponse
144+
.class));
145+
}
146+
}

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,11 @@
409409
<version>1.9.5</version>
410410
<scope>test</scope>
411411
</dependency>
412+
<dependency>
413+
<groupId>javax.servlet</groupId>
414+
<artifactId>javax.servlet-api</artifactId>
415+
<version>3.0.1</version>
416+
</dependency>
412417

413418
<!-- MITREid Connect components -->
414419
<dependency>

0 commit comments

Comments
 (0)