Skip to content
This repository was archived by the owner on Dec 12, 2018. It is now read-only.

Commit 089c796

Browse files
author
Mario
committed
1158 - Fixed issue with StormpathWrapperFilter and two failing ITs
1 parent ec7e60f commit 089c796

8 files changed

Lines changed: 778 additions & 874 deletions

File tree

extensions/spring/boot/stormpath-spring-security-webmvc-spring-boot-starter/src/test/groovy/com/stormpath/spring/boot/autoconfigure/StormpathWebSecurityAutoConfigurationIT.groovy

Lines changed: 312 additions & 309 deletions
Large diffs are not rendered by default.

extensions/spring/stormpath-spring-security-webmvc/src/main/java/com/stormpath/spring/config/AbstractStormpathWebSecurityConfiguration.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020
import com.stormpath.sdk.authc.AuthenticationResult;
2121
import com.stormpath.sdk.client.Client;
2222
import com.stormpath.sdk.idsite.IdSiteResultListener;
23+
import com.stormpath.sdk.lang.Assert;
2324
import com.stormpath.sdk.lang.Strings;
2425
import com.stormpath.sdk.saml.SamlResultListener;
2526
import com.stormpath.sdk.servlet.csrf.CsrfTokenManager;
2627
import com.stormpath.sdk.servlet.csrf.DisabledCsrfTokenManager;
2728
import com.stormpath.sdk.servlet.event.RequestEvent;
2829
import com.stormpath.sdk.servlet.event.impl.Publisher;
30+
import com.stormpath.sdk.servlet.filter.WrappedServletRequestFactory;
2931
import com.stormpath.sdk.servlet.filter.account.AccountResolverFilter;
3032
import com.stormpath.sdk.servlet.http.MediaType;
3133
import com.stormpath.sdk.servlet.http.Resolver;
@@ -59,9 +61,9 @@
5961

6062
import java.util.Arrays;
6163
import java.util.Collections;
64+
import java.util.LinkedHashSet;
6265
import java.util.List;
6366

64-
6567
/**
6668
* @since 1.0.RC5
6769
*/
@@ -141,6 +143,17 @@ public abstract class AbstractStormpathWebSecurityConfiguration {
141143
@Value("#{ @environment['stormpath.web.oauth2.uri'] ?: '/oauth/token' }")
142144
protected String accessTokenUri;
143145

146+
@Value("#{ @environment['stormpath.web.request.client.attributeNames'] ?: 'client' }")
147+
protected String clientRequestAttributeNames;
148+
149+
@Value("#{ @environment['stormpath.web.request.application.attributeNames'] ?: 'application' }")
150+
protected String applicationRequestAttributeNames;
151+
152+
@Autowired
153+
@Qualifier("stormpathWrappedServletRequestFactory")
154+
private WrappedServletRequestFactory wrappedServletRequestFactory;
155+
156+
144157
public StormpathWebSecurityConfigurer stormpathWebSecurityConfigurer() {
145158
return new StormpathWebSecurityConfigurer();
146159
}
@@ -278,7 +291,15 @@ public CorsConfigurationSource corsConfigurationSource() {
278291
* @since 1.3.0
279292
*/
280293
public StormpathWrapperFilter stormpathWrapperFilter() {
281-
return new StormpathWrapperFilter();
294+
Assert.notNull(clientRequestAttributeNames, "clientRequestAttributeNames cannot be null.");
295+
Assert.notNull(applicationRequestAttributeNames, "applicationRequestAttributeNames cannot be null.");
296+
StormpathWrapperFilter filter = new StormpathWrapperFilter();
297+
filter.setClientRequestAttributeNames(Strings.split(clientRequestAttributeNames) != null ? new LinkedHashSet<>(Arrays.asList(Strings.split(clientRequestAttributeNames))) : Collections.<String>emptySet());
298+
filter.setApplicationRequestAttributeNames(Strings.split(applicationRequestAttributeNames) != null ? new LinkedHashSet<>(Arrays.asList(Strings.split(applicationRequestAttributeNames))) : Collections.<String>emptySet());
299+
filter.setClient(client);
300+
filter.setApplication(application);
301+
filter.setWrappedServletRequestFactory(wrappedServletRequestFactory);
302+
return filter;
282303
}
283304

284305
}

extensions/spring/stormpath-spring-security-webmvc/src/main/java/com/stormpath/spring/config/StormpathWebSecurityConfiguration.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@
2020
import com.stormpath.sdk.servlet.filter.account.AccountResolverFilter;
2121
import com.stormpath.sdk.servlet.mvc.ErrorModelFactory;
2222
import com.stormpath.spring.filter.ContentNegotiationSpringSecurityAuthenticationFilter;
23-
//import com.stormpath.spring.filter.SpringSecurityResolvedAccountFilter;
2423
import com.stormpath.spring.filter.StormpathSecurityContextPersistenceFilter;
25-
//import com.stormpath.spring.oauth.OAuthAuthenticationSpringSecurityProcessingFilter;
26-
//import com.stormpath.spring.filter.StormpathWrapperFilter;
2724
import com.stormpath.spring.filter.StormpathWrapperFilter;
2825
import com.stormpath.spring.security.provider.SocialCallbackSpringSecurityProcessingFilter;
2926
import org.springframework.context.annotation.Bean;
@@ -35,8 +32,6 @@
3532
import org.springframework.security.web.csrf.CsrfTokenRepository;
3633
import org.springframework.web.cors.CorsConfigurationSource;
3734

38-
import javax.servlet.Filter;
39-
4035
/**
4136
* @since 1.0.RC5
4237
*/

extensions/spring/stormpath-spring-security-webmvc/src/main/java/com/stormpath/spring/config/StormpathWebSecurityConfigurer.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ public class StormpathWebSecurityConfigurer extends SecurityConfigurerAdapter<De
8484
@Autowired
8585
StormpathSecurityContextPersistenceFilter stormpathSecurityContextPersistenceFilter;
8686

87+
/**
88+
* This filter adds Client and Application as attributes to every request in order for subsequent Filters to have access to them.
89+
* For example, a filter trying to validate an access token will need to have access to the Application (see AuthorizationHeaderAccountResolver)
90+
*
91+
* @since 1.3.0
92+
*/
93+
@Autowired
94+
protected StormpathWrapperFilter stormpathWrapperFilter;
95+
8796
@Autowired
8897
AuthenticationEntryPoint stormpathAuthenticationEntryPoint;
8998

@@ -227,9 +236,6 @@ public class StormpathWebSecurityConfigurer extends SecurityConfigurerAdapter<De
227236
@Qualifier("loginPostHandler")
228237
protected WebHandler loginPostHandler;
229238

230-
@Autowired
231-
protected StormpathWrapperFilter stormpathWrapperFilter;
232-
233239
/**
234240
* Extend WebSecurityConfigurerAdapter and configure the {@code HttpSecurity} object using
235241
* the {@link com.stormpath.spring.config.StormpathWebSecurityConfigurer#stormpath stormpath()} utility method.

extensions/spring/stormpath-spring-security-webmvc/src/main/java/com/stormpath/spring/filter/StormpathWrapperFilter.java

Lines changed: 26 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -19,73 +19,50 @@
1919
import com.stormpath.sdk.client.Client;
2020
import com.stormpath.sdk.impl.http.HttpHeadersHolder;
2121
import com.stormpath.sdk.lang.Assert;
22-
import com.stormpath.sdk.lang.Strings;
2322
import com.stormpath.sdk.servlet.filter.HttpFilter;
2423
import com.stormpath.sdk.servlet.filter.WrappedServletRequestFactory;
25-
import org.springframework.beans.factory.annotation.Autowired;
26-
import org.springframework.beans.factory.annotation.Qualifier;
27-
import org.springframework.beans.factory.annotation.Value;
2824

2925
import javax.servlet.FilterChain;
30-
import javax.servlet.ServletException;
3126
import javax.servlet.http.HttpServletRequest;
3227
import javax.servlet.http.HttpServletResponse;
33-
import java.util.Arrays;
3428
import java.util.Collections;
3529
import java.util.Enumeration;
3630
import java.util.LinkedHashMap;
31+
import java.util.LinkedHashSet;
3732
import java.util.List;
3833
import java.util.Map;
3934
import java.util.Set;
4035

36+
/**
37+
* This filter adds Client and Application as attributes to every request in order for subsequent Filters to have access to them.
38+
* For example, a filter trying to validate an access token will need to have access to the Application (see AuthorizationHeaderAccountResolver)
39+
*
40+
* @since 1.3.0
41+
*/
4142
public class StormpathWrapperFilter extends HttpFilter {
4243

43-
// private Set<String> clientRequestAttributeNames;
44-
// private Set<String> applicationRequestAttributeNames;
45-
@Autowired
46-
@Qualifier("stormpathWrappedServletRequestFactory")
47-
private WrappedServletRequestFactory factory;
48-
49-
@Autowired
5044
protected Client client;
5145

52-
@Autowired
5346
protected Application application;
5447

55-
@Value("#{ @environment['stormpath.web.request.client.attributeNames'] ?: 'client' }")
56-
protected String clientRequestAttributeNames;
48+
protected Set<String> clientRequestAttributeNameList;
5749

58-
@Value("#{ @environment['stormpath.web.request.application.attributeNames'] ?: 'application' }")
59-
protected String applicationRequestAttributeNames;
50+
protected Set<String> applicationRequestAttributeNameList;
6051

61-
private List<String> clientRequestAttributeNamesList;
62-
63-
private List<String> applicationRequestAttributeNameList;
52+
protected WrappedServletRequestFactory wrappedServletRequestFactory;
6453

6554
public StormpathWrapperFilter() {
66-
this.clientRequestAttributeNamesList = Strings.split(clientRequestAttributeNames) != null ? Arrays.asList(Strings.split(clientRequestAttributeNames)) : Collections.<String>emptyList();
67-
this.applicationRequestAttributeNameList = Strings.split(applicationRequestAttributeNames) != null ? Arrays.asList(Strings.split(applicationRequestAttributeNames)) : Collections.<String>emptyList();
6855
}
6956

70-
// public void setFilterChainResolver(FilterChainResolver filterChainResolver) {
71-
// Assert.notNull(filterChainResolver, "FilterChainResolver cannot be null.");
72-
// //this.filterChainResolver = filterChainResolver;
73-
// }
74-
75-
// public void setClientRequestAttributeNames(Set<String> clientRequestAttributeNames) {
76-
// this.clientRequestAttributeNames =
77-
// clientRequestAttributeNames != null ? clientRequestAttributeNames : new LinkedHashSet<>();
78-
// }
79-
//
80-
// public void setApplicationRequestAttributeNames(Set<String> applicationRequestAttributeNames) {
81-
// this.applicationRequestAttributeNames =
82-
// applicationRequestAttributeNames != null ? applicationRequestAttributeNames : new LinkedHashSet<String>();
83-
// }
84-
//
85-
// public void setWrappedServletRequestFactory(WrappedServletRequestFactory factory) {
86-
// Assert.notNull(factory, "WrappedServletRequestFactory cannot be null.");
87-
// this.factory = factory;
88-
// }
57+
public void setClientRequestAttributeNames(Set<String> clientRequestAttributeNames) {
58+
this.clientRequestAttributeNameList =
59+
clientRequestAttributeNames != null ? clientRequestAttributeNames : new LinkedHashSet<String>();
60+
}
61+
62+
public void setApplicationRequestAttributeNames(Set<String> applicationRequestAttributeNames) {
63+
this.applicationRequestAttributeNameList =
64+
applicationRequestAttributeNames != null ? applicationRequestAttributeNames : new LinkedHashSet<String>();
65+
}
8966

9067
public void setClient(Client client) {
9168
this.client = client;
@@ -95,35 +72,15 @@ public void setApplication(Application application) {
9572
this.application = application;
9673
}
9774

98-
@Override
99-
protected void onInit() throws ServletException {
100-
//Assert.notNull(filterChainResolver, "FilterChainResolver cannot be null.");
101-
Assert.notNull(clientRequestAttributeNames, "clientRequestAttributeNames cannot be null.");
102-
Assert.notNull(applicationRequestAttributeNames, "applicationRequestAttributeNames cannot be null.");
103-
Assert.notNull(factory, "WrappedServletRequestFactory cannot be null.");
104-
Assert.notNull(client, "Client instance cannot be null.");
105-
Assert.notNull(application, "Application instance cannot be null.");
106-
}
107-
108-
// protected FilterChainResolver getFilterChainResolver() {
109-
// return this.filterChainResolver;
110-
// }
111-
11275
@Override
11376
public void filter(HttpServletRequest request, HttpServletResponse response, final FilterChain chain)
11477
throws Exception {
11578

116-
// FilterChainResolver resolver = getFilterChainResolver();
117-
// Assert.notNull(resolver, "Filter has not yet been configured. Explicitly call setFilterChainResolver or " +
118-
// "init(FilterConfig).");
119-
12079
setRequestAttributes(request);
12180

12281
//wrap:
12382
request = wrapRequest(request, response);
12483

125-
//FilterChain target = resolver.getChain(request, response, chain);
126-
12784
//continue:
12885
chain.doFilter(request, response);
12986

@@ -148,13 +105,18 @@ protected void setRequestAttributes(HttpServletRequest request) {
148105
HttpHeadersHolder.set(headersMap);
149106
}
150107

108+
public void setWrappedServletRequestFactory(WrappedServletRequestFactory factory) {
109+
Assert.notNull(factory, "WrappedServletRequestFactory cannot be null.");
110+
this.wrappedServletRequestFactory = factory;
111+
}
112+
151113
protected void setClientRequestAttributes(HttpServletRequest request) {
152114
String name = Client.class.getName();
153115
//value must always be set:
154116
request.setAttribute(name, client);
155117

156118
//user customized values:
157-
for (String aName : applicationRequestAttributeNameList) {
119+
for (String aName : clientRequestAttributeNameList) {
158120
request.setAttribute(aName, client);
159121
}
160122
}
@@ -171,7 +133,7 @@ protected void setApplicationRequestAttributes(HttpServletRequest request) {
171133
}
172134

173135
protected HttpServletRequest wrapRequest(HttpServletRequest request, HttpServletResponse response) {
174-
return this.factory.wrapHttpServletRequest(request, response);
136+
return this.wrappedServletRequestFactory.wrapHttpServletRequest(request, response);
175137
}
176138

177139
}

0 commit comments

Comments
 (0)