@ -17,16 +17,20 @@
@@ -17,16 +17,20 @@
package org.springframework.security.web.access ;
import java.util.Collections ;
import java.util.HashMap ;
import java.util.List ;
import java.util.Map ;
import jakarta.servlet.ServletContext ;
import jakarta.servlet.http.HttpServletRequest ;
import jakarta.servlet.http.HttpServletRequestWrapper ;
import org.springframework.security.core.Authentication ;
import org.springframework.security.web.FilterInvocation ;
import org.springframework.security.web.util.matcher.RequestMatcherEntry ;
import org.springframework.util.Assert ;
import org.springframework.web.context.ServletContextAware ;
import org.springframework.web.util.ServletRequestPathUtils ;
/ * *
* A { @link WebInvocationPrivilegeEvaluator } which delegates to a list of
@ -116,8 +120,10 @@ public final class RequestMatcherDelegatingWebInvocationPrivilegeEvaluator
@@ -116,8 +120,10 @@ public final class RequestMatcherDelegatingWebInvocationPrivilegeEvaluator
private List < WebInvocationPrivilegeEvaluator > getDelegate ( String contextPath , String uri , String method ) {
FilterInvocation filterInvocation = new FilterInvocation ( contextPath , uri , method , this . servletContext ) ;
HttpServletRequest request = new AttributesSupportingHttpServletRequest ( filterInvocation . getHttpRequest ( ) ) ;
ServletRequestPathUtils . parseAndCache ( request ) ;
for ( RequestMatcherEntry < List < WebInvocationPrivilegeEvaluator > > delegate : this . delegates ) {
if ( delegate . getRequestMatcher ( ) . matches ( filterInvocation . getHttpRequest ( ) ) ) {
if ( delegate . getRequestMatcher ( ) . matches ( request ) ) {
return delegate . getEntry ( ) ;
}
}
@ -129,4 +135,29 @@ public final class RequestMatcherDelegatingWebInvocationPrivilegeEvaluator
@@ -129,4 +135,29 @@ public final class RequestMatcherDelegatingWebInvocationPrivilegeEvaluator
this . servletContext = servletContext ;
}
private static final class AttributesSupportingHttpServletRequest extends HttpServletRequestWrapper {
private final Map < String , Object > attributes = new HashMap < > ( ) ;
AttributesSupportingHttpServletRequest ( HttpServletRequest request ) {
super ( request ) ;
}
@Override
public Object getAttribute ( String name ) {
return this . attributes . get ( name ) ;
}
@Override
public void setAttribute ( String name , Object value ) {
this . attributes . put ( name , value ) ;
}
@Override
public void removeAttribute ( String name ) {
this . attributes . remove ( name ) ;
}
}
}