Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
fc6c07ad
Commit
fc6c07ad
authored
Nov 29, 2018
by
Madhura Bhave
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '2.0.x'
parents
4ddd8198
decaacdd
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
386 additions
and
42 deletions
+386
-42
ServletEndpointManagementContextConfiguration.java
...nt/web/ServletEndpointManagementContextConfiguration.java
+12
-1
AbstractEndpointRequestIntegrationTests.java
...rity/servlet/AbstractEndpointRequestIntegrationTests.java
+1
-1
JerseyEndpointRequestIntegrationTests.java
...curity/servlet/JerseyEndpointRequestIntegrationTests.java
+40
-0
JerseyAutoConfiguration.java
...rk/boot/autoconfigure/jersey/JerseyAutoConfiguration.java
+20
-20
JerseyRequestMatcherProvider.java
...figure/security/servlet/JerseyRequestMatcherProvider.java
+43
-0
SecurityRequestMatcherProviderAutoConfiguration.java
...vlet/SecurityRequestMatcherProviderAutoConfiguration.java
+31
-6
JerseyApplicationPath.java
...boot/autoconfigure/web/servlet/JerseyApplicationPath.java
+89
-0
SecurityRequestMatcherProviderAutoConfigurationTests.java
...SecurityRequestMatcherProviderAutoConfigurationTests.java
+57
-14
JerseyApplicationPathTests.java
...autoconfigure/web/servlet/JerseyApplicationPathTests.java
+93
-0
No files found.
spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration.java
View file @
fc6c07ad
...
@@ -28,6 +28,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClas
...
@@ -28,6 +28,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClas
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type
;
import
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath
;
import
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath
;
import
org.springframework.boot.autoconfigure.web.servlet.JerseyApplicationPath
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
...
@@ -82,11 +83,21 @@ public class ServletEndpointManagementContextConfiguration {
...
@@ -82,11 +83,21 @@ public class ServletEndpointManagementContextConfiguration {
@ConditionalOnMissingClass
(
"org.springframework.web.servlet.DispatcherServlet"
)
@ConditionalOnMissingClass
(
"org.springframework.web.servlet.DispatcherServlet"
)
public
static
class
JerseyServletEndpointManagementContextConfiguration
{
public
static
class
JerseyServletEndpointManagementContextConfiguration
{
private
final
ApplicationContext
context
;
public
JerseyServletEndpointManagementContextConfiguration
(
ApplicationContext
context
)
{
this
.
context
=
context
;
}
@Bean
@Bean
public
ServletEndpointRegistrar
servletEndpointRegistrar
(
public
ServletEndpointRegistrar
servletEndpointRegistrar
(
WebEndpointProperties
properties
,
WebEndpointProperties
properties
,
ServletEndpointsSupplier
servletEndpointsSupplier
)
{
ServletEndpointsSupplier
servletEndpointsSupplier
)
{
return
new
ServletEndpointRegistrar
(
properties
.
getBasePath
(),
JerseyApplicationPath
jerseyApplicationPath
=
this
.
context
.
getBean
(
JerseyApplicationPath
.
class
);
return
new
ServletEndpointRegistrar
(
jerseyApplicationPath
.
getRelativePath
(
properties
.
getBasePath
()),
servletEndpointsSupplier
.
getEndpoints
());
servletEndpointsSupplier
.
getEndpoints
());
}
}
...
...
spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/security/servlet/AbstractEndpointRequestIntegrationTests.java
View file @
fc6c07ad
...
@@ -161,7 +161,7 @@ public abstract class AbstractEndpointRequestIntegrationTests {
...
@@ -161,7 +161,7 @@ public abstract class AbstractEndpointRequestIntegrationTests {
}
}
interface
TestPathMappedEndpoint
public
interface
TestPathMappedEndpoint
extends
ExposableEndpoint
<
Operation
>,
PathMappedEndpoint
{
extends
ExposableEndpoint
<
Operation
>,
PathMappedEndpoint
{
}
}
...
...
spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/security/servlet/JerseyEndpointRequestIntegrationTests.java
View file @
fc6c07ad
...
@@ -23,6 +23,7 @@ import java.util.List;
...
@@ -23,6 +23,7 @@ import java.util.List;
import
org.glassfish.jersey.server.ResourceConfig
;
import
org.glassfish.jersey.server.ResourceConfig
;
import
org.glassfish.jersey.server.model.Resource
;
import
org.glassfish.jersey.server.model.Resource
;
import
org.junit.Test
;
import
org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties
;
import
org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties
;
import
org.springframework.boot.actuate.endpoint.http.ActuatorMediaType
;
import
org.springframework.boot.actuate.endpoint.http.ActuatorMediaType
;
...
@@ -40,12 +41,14 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfi
...
@@ -40,12 +41,14 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfi
import
org.springframework.boot.autoconfigure.security.servlet.SecurityRequestMatcherProviderAutoConfiguration
;
import
org.springframework.boot.autoconfigure.security.servlet.SecurityRequestMatcherProviderAutoConfiguration
;
import
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
;
import
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.boot.test.context.FilteredClassLoader
;
import
org.springframework.boot.test.context.runner.WebApplicationContextRunner
;
import
org.springframework.boot.test.context.runner.WebApplicationContextRunner
;
import
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
;
import
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
;
import
org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
;
import
org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.test.web.reactive.server.WebTestClient
;
/**
/**
* Integration tests for {@link EndpointRequest} with Jersey.
* Integration tests for {@link EndpointRequest} with Jersey.
...
@@ -59,6 +62,8 @@ public class JerseyEndpointRequestIntegrationTests
...
@@ -59,6 +62,8 @@ public class JerseyEndpointRequestIntegrationTests
protected
WebApplicationContextRunner
getContextRunner
()
{
protected
WebApplicationContextRunner
getContextRunner
()
{
return
new
WebApplicationContextRunner
(
return
new
WebApplicationContextRunner
(
AnnotationConfigServletWebServerApplicationContext:
:
new
)
AnnotationConfigServletWebServerApplicationContext:
:
new
)
.
withClassLoader
(
new
FilteredClassLoader
(
"org.springframework.web.servlet.DispatcherServlet"
))
.
withUserConfiguration
(
JerseyEndpointConfiguration
.
class
,
.
withUserConfiguration
(
JerseyEndpointConfiguration
.
class
,
SecurityConfiguration
.
class
,
BaseConfiguration
.
class
)
SecurityConfiguration
.
class
,
BaseConfiguration
.
class
)
.
withConfiguration
(
AutoConfigurations
.
of
(
.
withConfiguration
(
AutoConfigurations
.
of
(
...
@@ -69,6 +74,41 @@ public class JerseyEndpointRequestIntegrationTests
...
@@ -69,6 +74,41 @@ public class JerseyEndpointRequestIntegrationTests
JerseyAutoConfiguration
.
class
));
JerseyAutoConfiguration
.
class
));
}
}
@Test
public
void
toLinksWhenApplicationPathSetShouldMatch
()
{
getContextRunner
().
withPropertyValues
(
"spring.jersey.application-path=/admin"
)
.
run
((
context
)
->
{
WebTestClient
webTestClient
=
getWebTestClient
(
context
);
webTestClient
.
get
().
uri
(
"/admin/actuator/"
).
exchange
().
expectStatus
()
.
isOk
();
webTestClient
.
get
().
uri
(
"/admin/actuator"
).
exchange
().
expectStatus
()
.
isOk
();
});
}
@Test
public
void
toEndpointWhenApplicationPathSetShouldMatch
()
{
getContextRunner
().
withPropertyValues
(
"spring.jersey.application-path=/admin"
)
.
run
((
context
)
->
{
WebTestClient
webTestClient
=
getWebTestClient
(
context
);
webTestClient
.
get
().
uri
(
"/admin/actuator/e1"
).
exchange
()
.
expectStatus
().
isOk
();
});
}
@Test
public
void
toAnyEndpointWhenApplicationPathSetShouldMatch
()
{
getContextRunner
().
withPropertyValues
(
"spring.jersey.application-path=/admin"
,
"spring.security.user.password=password"
).
run
((
context
)
->
{
WebTestClient
webTestClient
=
getWebTestClient
(
context
);
webTestClient
.
get
().
uri
(
"/admin/actuator/e2"
).
exchange
()
.
expectStatus
().
isUnauthorized
();
webTestClient
.
get
().
uri
(
"/admin/actuator/e2"
)
.
header
(
"Authorization"
,
getBasicAuth
()).
exchange
()
.
expectStatus
().
isOk
();
});
}
@Configuration
@Configuration
@EnableConfigurationProperties
(
WebEndpointProperties
.
class
)
@EnableConfigurationProperties
(
WebEndpointProperties
.
class
)
static
class
JerseyEndpointConfiguration
{
static
class
JerseyEndpointConfiguration
{
...
...
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java
View file @
fc6c07ad
...
@@ -16,7 +16,7 @@
...
@@ -16,7 +16,7 @@
package
org
.
springframework
.
boot
.
autoconfigure
.
jersey
;
package
org
.
springframework
.
boot
.
autoconfigure
.
jersey
;
import
java.util.
Array
s
;
import
java.util.
Collection
s
;
import
java.util.EnumSet
;
import
java.util.EnumSet
;
import
javax.annotation.PostConstruct
;
import
javax.annotation.PostConstruct
;
...
@@ -52,6 +52,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplicat
...
@@ -52,6 +52,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplicat
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type
;
import
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
;
import
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
;
import
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
;
import
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
;
import
org.springframework.boot.autoconfigure.web.servlet.JerseyApplicationPath
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.boot.web.servlet.DynamicRegistrationBean
;
import
org.springframework.boot.web.servlet.DynamicRegistrationBean
;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
...
@@ -93,8 +94,6 @@ public class JerseyAutoConfiguration implements ServletContextAware {
...
@@ -93,8 +94,6 @@ public class JerseyAutoConfiguration implements ServletContextAware {
private
final
ObjectProvider
<
ResourceConfigCustomizer
>
customizers
;
private
final
ObjectProvider
<
ResourceConfigCustomizer
>
customizers
;
private
String
path
;
public
JerseyAutoConfiguration
(
JerseyProperties
jersey
,
ResourceConfig
config
,
public
JerseyAutoConfiguration
(
JerseyProperties
jersey
,
ResourceConfig
config
,
ObjectProvider
<
ResourceConfigCustomizer
>
customizers
)
{
ObjectProvider
<
ResourceConfigCustomizer
>
customizers
)
{
this
.
jersey
=
jersey
;
this
.
jersey
=
jersey
;
...
@@ -104,16 +103,15 @@ public class JerseyAutoConfiguration implements ServletContextAware {
...
@@ -104,16 +103,15 @@ public class JerseyAutoConfiguration implements ServletContextAware {
@PostConstruct
@PostConstruct
public
void
path
()
{
public
void
path
()
{
resolveApplicationPath
();
customize
();
customize
();
}
}
private
void
resolveApplicationPath
()
{
private
String
resolveApplicationPath
()
{
if
(
StringUtils
.
hasLength
(
this
.
jersey
.
getApplicationPath
()))
{
if
(
StringUtils
.
hasLength
(
this
.
jersey
.
getApplicationPath
()))
{
this
.
path
=
parseApplicationPath
(
this
.
jersey
.
getApplicationPath
()
);
return
this
.
jersey
.
getApplicationPath
(
);
}
}
else
{
else
{
this
.
path
=
findApplicationPath
(
AnnotationUtils
.
findAnnotation
(
return
findApplicationPath
(
AnnotationUtils
.
findAnnotation
(
this
.
config
.
getApplication
().
getClass
(),
ApplicationPath
.
class
));
this
.
config
.
getApplication
().
getClass
(),
ApplicationPath
.
class
));
}
}
}
}
...
@@ -123,16 +121,24 @@ public class JerseyAutoConfiguration implements ServletContextAware {
...
@@ -123,16 +121,24 @@ public class JerseyAutoConfiguration implements ServletContextAware {
.
forEach
((
customizer
)
->
customizer
.
customize
(
this
.
config
));
.
forEach
((
customizer
)
->
customizer
.
customize
(
this
.
config
));
}
}
@Bean
@ConditionalOnMissingBean
public
JerseyApplicationPath
jerseyApplicationPath
()
{
return
this
::
resolveApplicationPath
;
}
@Bean
@Bean
@ConditionalOnMissingBean
(
name
=
"jerseyFilterRegistration"
)
@ConditionalOnMissingBean
(
name
=
"jerseyFilterRegistration"
)
@ConditionalOnProperty
(
prefix
=
"spring.jersey"
,
name
=
"type"
,
havingValue
=
"filter"
)
@ConditionalOnProperty
(
prefix
=
"spring.jersey"
,
name
=
"type"
,
havingValue
=
"filter"
)
public
FilterRegistrationBean
<
ServletContainer
>
jerseyFilterRegistration
()
{
public
FilterRegistrationBean
<
ServletContainer
>
jerseyFilterRegistration
(
JerseyApplicationPath
applicationPath
)
{
FilterRegistrationBean
<
ServletContainer
>
registration
=
new
FilterRegistrationBean
<>();
FilterRegistrationBean
<
ServletContainer
>
registration
=
new
FilterRegistrationBean
<>();
registration
.
setFilter
(
new
ServletContainer
(
this
.
config
));
registration
.
setFilter
(
new
ServletContainer
(
this
.
config
));
registration
.
setUrlPatterns
(
Arrays
.
asList
(
this
.
path
));
registration
.
setUrlPatterns
(
Collections
.
singletonList
(
applicationPath
.
getUrlMapping
()));
registration
.
setOrder
(
this
.
jersey
.
getFilter
().
getOrder
());
registration
.
setOrder
(
this
.
jersey
.
getFilter
().
getOrder
());
registration
.
addInitParameter
(
ServletProperties
.
FILTER_CONTEXT_PATH
,
registration
.
addInitParameter
(
ServletProperties
.
FILTER_CONTEXT_PATH
,
stripPattern
(
this
.
path
));
stripPattern
(
applicationPath
.
getPath
()
));
addInitParameters
(
registration
);
addInitParameters
(
registration
);
registration
.
setName
(
"jerseyFilter"
);
registration
.
setName
(
"jerseyFilter"
);
registration
.
setDispatcherTypes
(
EnumSet
.
allOf
(
DispatcherType
.
class
));
registration
.
setDispatcherTypes
(
EnumSet
.
allOf
(
DispatcherType
.
class
));
...
@@ -149,9 +155,10 @@ public class JerseyAutoConfiguration implements ServletContextAware {
...
@@ -149,9 +155,10 @@ public class JerseyAutoConfiguration implements ServletContextAware {
@Bean
@Bean
@ConditionalOnMissingBean
(
name
=
"jerseyServletRegistration"
)
@ConditionalOnMissingBean
(
name
=
"jerseyServletRegistration"
)
@ConditionalOnProperty
(
prefix
=
"spring.jersey"
,
name
=
"type"
,
havingValue
=
"servlet"
,
matchIfMissing
=
true
)
@ConditionalOnProperty
(
prefix
=
"spring.jersey"
,
name
=
"type"
,
havingValue
=
"servlet"
,
matchIfMissing
=
true
)
public
ServletRegistrationBean
<
ServletContainer
>
jerseyServletRegistration
()
{
public
ServletRegistrationBean
<
ServletContainer
>
jerseyServletRegistration
(
JerseyApplicationPath
applicationPath
)
{
ServletRegistrationBean
<
ServletContainer
>
registration
=
new
ServletRegistrationBean
<>(
ServletRegistrationBean
<
ServletContainer
>
registration
=
new
ServletRegistrationBean
<>(
new
ServletContainer
(
this
.
config
),
this
.
path
);
new
ServletContainer
(
this
.
config
),
applicationPath
.
getUrlMapping
()
);
addInitParameters
(
registration
);
addInitParameters
(
registration
);
registration
.
setName
(
getServletRegistrationName
());
registration
.
setName
(
getServletRegistrationName
());
registration
.
setLoadOnStartup
(
this
.
jersey
.
getServlet
().
getLoadOnStartup
());
registration
.
setLoadOnStartup
(
this
.
jersey
.
getServlet
().
getLoadOnStartup
());
...
@@ -171,14 +178,7 @@ public class JerseyAutoConfiguration implements ServletContextAware {
...
@@ -171,14 +178,7 @@ public class JerseyAutoConfiguration implements ServletContextAware {
if
(
annotation
==
null
)
{
if
(
annotation
==
null
)
{
return
"/*"
;
return
"/*"
;
}
}
return
parseApplicationPath
(
annotation
.
value
());
return
annotation
.
value
();
}
private
static
String
parseApplicationPath
(
String
applicationPath
)
{
if
(!
applicationPath
.
startsWith
(
"/"
))
{
applicationPath
=
"/"
+
applicationPath
;
}
return
applicationPath
.
equals
(
"/"
)
?
"/*"
:
applicationPath
+
"/*"
;
}
}
@Override
@Override
...
...
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/servlet/JerseyRequestMatcherProvider.java
0 → 100644
View file @
fc6c07ad
/*
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
autoconfigure
.
security
.
servlet
;
import
org.springframework.boot.autoconfigure.web.servlet.JerseyApplicationPath
;
import
org.springframework.security.web.util.matcher.AntPathRequestMatcher
;
import
org.springframework.security.web.util.matcher.RequestMatcher
;
/**
* {@link RequestMatcherProvider} that provides an {@link AntPathRequestMatcher} that can
* be used for Jersey applications.
*
* @author Madhura Bhave
* @since 2.0.7
*/
public
class
JerseyRequestMatcherProvider
implements
RequestMatcherProvider
{
private
final
JerseyApplicationPath
jerseyApplicationPath
;
public
JerseyRequestMatcherProvider
(
JerseyApplicationPath
jerseyApplicationPath
)
{
this
.
jerseyApplicationPath
=
jerseyApplicationPath
;
}
@Override
public
RequestMatcher
getRequestMatcher
(
String
pattern
)
{
return
new
AntPathRequestMatcher
(
this
.
jerseyApplicationPath
.
getRelativePath
(
pattern
));
}
}
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/servlet/SecurityRequestMatcherProviderAutoConfiguration.java
View file @
fc6c07ad
...
@@ -15,9 +15,13 @@
...
@@ -15,9 +15,13 @@
*/
*/
package
org
.
springframework
.
boot
.
autoconfigure
.
security
.
servlet
;
package
org
.
springframework
.
boot
.
autoconfigure
.
security
.
servlet
;
import
org.glassfish.jersey.server.ResourceConfig
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication
;
import
org.springframework.boot.autoconfigure.web.servlet.JerseyApplicationPath
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.security.web.util.matcher.RequestMatcher
;
import
org.springframework.security.web.util.matcher.RequestMatcher
;
...
@@ -31,15 +35,36 @@ import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
...
@@ -31,15 +35,36 @@ import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
* @since 2.0.5
* @since 2.0.5
*/
*/
@Configuration
@Configuration
@ConditionalOnClass
({
RequestMatcher
.
class
,
DispatcherServlet
.
class
})
@ConditionalOnClass
({
RequestMatcher
.
class
})
@ConditionalOnWebApplication
(
type
=
ConditionalOnWebApplication
.
Type
.
SERVLET
)
@ConditionalOnWebApplication
(
type
=
ConditionalOnWebApplication
.
Type
.
SERVLET
)
@ConditionalOnBean
(
HandlerMappingIntrospector
.
class
)
public
class
SecurityRequestMatcherProviderAutoConfiguration
{
public
class
SecurityRequestMatcherProviderAutoConfiguration
{
@Bean
@Configuration
public
RequestMatcherProvider
requestMatcherProvider
(
@ConditionalOnClass
(
DispatcherServlet
.
class
)
HandlerMappingIntrospector
introspector
)
{
@ConditionalOnBean
(
HandlerMappingIntrospector
.
class
)
return
new
MvcRequestMatcherProvider
(
introspector
);
public
static
class
MvcRequestMatcherConfiguration
{
@Bean
@ConditionalOnClass
(
DispatcherServlet
.
class
)
public
RequestMatcherProvider
requestMatcherProvider
(
HandlerMappingIntrospector
introspector
)
{
return
new
MvcRequestMatcherProvider
(
introspector
);
}
}
@Configuration
@ConditionalOnClass
(
ResourceConfig
.
class
)
@ConditionalOnMissingClass
(
"org.springframework.web.servlet.DispatcherServlet"
)
@ConditionalOnBean
(
JerseyApplicationPath
.
class
)
public
static
class
JerseyRequestMatcherConfiguration
{
@Bean
public
RequestMatcherProvider
requestMatcherProvider
(
JerseyApplicationPath
applicationPath
)
{
return
new
JerseyRequestMatcherProvider
(
applicationPath
);
}
}
}
}
}
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/JerseyApplicationPath.java
0 → 100644
View file @
fc6c07ad
/*
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
autoconfigure
.
web
.
servlet
;
import
org.springframework.boot.web.servlet.ServletRegistrationBean
;
/**
* Interface that can be used by auto-configurations that need path details Jersey's
* application path that serves as the base URI for the application.
*
* @author Madhura Bhave
* @since 2.0.7
*/
@FunctionalInterface
public
interface
JerseyApplicationPath
{
/**
* Returns the configured path of the application.
* @return the configured path
*/
String
getPath
();
/**
* Return a form of the given path that's relative to the Jersey application path.
* @param path the path to make relative
* @return the relative path
*/
default
String
getRelativePath
(
String
path
)
{
String
prefix
=
getPrefix
();
if
(!
path
.
startsWith
(
"/"
))
{
path
=
"/"
+
path
;
}
return
prefix
+
path
;
}
/**
* Return a cleaned up version of the path that can be used as a prefix for URLs. The
* resulting path will have path will not have a trailing slash.
* @return the prefix
* @see #getRelativePath(String)
*/
default
String
getPrefix
()
{
String
result
=
getPath
();
int
index
=
result
.
indexOf
(
'*'
);
if
(
index
!=
-
1
)
{
result
=
result
.
substring
(
0
,
index
);
}
if
(
result
.
endsWith
(
"/"
))
{
result
=
result
.
substring
(
0
,
result
.
length
()
-
1
);
}
return
result
;
}
/**
* Return a URL mapping pattern that can be used with a
* {@link ServletRegistrationBean} to map Jersey's servlet.
* @return the path as a servlet URL mapping
*/
default
String
getUrlMapping
()
{
String
path
=
getPath
();
if
(!
path
.
startsWith
(
"/"
))
{
path
=
"/"
+
path
;
}
if
(
path
.
equals
(
"/"
))
{
return
"/*"
;
}
if
(
path
.
contains
(
"*"
))
{
return
path
;
}
if
(
path
.
endsWith
(
"/"
))
{
return
path
+
"*"
;
}
return
path
+
"/*"
;
}
}
spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/servlet/SecurityRequestMatcherProviderAutoConfigurationTests.java
View file @
fc6c07ad
...
@@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.security.servlet;
...
@@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.security.servlet;
import
org.junit.Test
;
import
org.junit.Test
;
import
org.springframework.boot.autoconfigure.AutoConfigurations
;
import
org.springframework.boot.autoconfigure.AutoConfigurations
;
import
org.springframework.boot.autoconfigure.web.servlet.JerseyApplicationPath
;
import
org.springframework.boot.test.context.FilteredClassLoader
;
import
org.springframework.boot.test.context.FilteredClassLoader
;
import
org.springframework.boot.test.context.runner.ApplicationContextRunner
;
import
org.springframework.boot.test.context.runner.ApplicationContextRunner
;
import
org.springframework.boot.test.context.runner.WebApplicationContextRunner
;
import
org.springframework.boot.test.context.runner.WebApplicationContextRunner
;
...
@@ -36,23 +37,44 @@ public class SecurityRequestMatcherProviderAutoConfigurationTests {
...
@@ -36,23 +37,44 @@ public class SecurityRequestMatcherProviderAutoConfigurationTests {
private
WebApplicationContextRunner
contextRunner
=
new
WebApplicationContextRunner
()
private
WebApplicationContextRunner
contextRunner
=
new
WebApplicationContextRunner
()
.
withConfiguration
(
AutoConfigurations
.
withConfiguration
(
AutoConfigurations
.
of
(
SecurityRequestMatcherProviderAutoConfiguration
.
class
))
.
of
(
SecurityRequestMatcherProviderAutoConfiguration
.
class
));
.
withUserConfiguration
(
TestConfiguration
.
class
);
@Test
public
void
configurationConditionalOnWebApplication
()
{
new
ApplicationContextRunner
()
.
withConfiguration
(
AutoConfigurations
.
of
(
SecurityRequestMatcherProviderAutoConfiguration
.
class
))
.
withUserConfiguration
(
TestMvcConfiguration
.
class
)
.
run
((
context
)
->
assertThat
(
context
)
.
doesNotHaveBean
(
RequestMatcherProvider
.
class
));
}
@Test
public
void
configurationConditionalOnRequestMatcherClass
()
{
this
.
contextRunner
.
withClassLoader
(
new
FilteredClassLoader
(
"org.springframework.security.web.util.matcher.RequestMatcher"
))
.
run
((
context
)
->
assertThat
(
context
)
.
doesNotHaveBean
(
RequestMatcherProvider
.
class
));
}
@Test
@Test
public
void
registersMvcRequestMatcherProviderIfMvcPresent
()
{
public
void
registersMvcRequestMatcherProviderIfMvcPresent
()
{
this
.
contextRunner
.
run
((
context
)
->
assertThat
(
context
)
this
.
contextRunner
.
withUserConfiguration
(
TestMvcConfiguration
.
class
)
.
hasSingleBean
(
MvcRequestMatcherProvider
.
class
));
.
run
((
context
)
->
assertThat
(
context
)
.
getBean
(
RequestMatcherProvider
.
class
)
.
isInstanceOf
(
MvcRequestMatcherProvider
.
class
));
}
}
@Test
@Test
public
void
mvcRequestMatcherProviderConditionalOnWebApplication
()
{
public
void
registersRequestMatcherForJerseyProviderIfJerseyPresentAndMvcAbsent
()
{
new
ApplicationContextRunner
()
this
.
contextRunner
.
withC
onfiguration
(
AutoConfigurations
.
withC
lassLoader
(
new
FilteredClassLoader
(
.
of
(
SecurityRequestMatcherProviderAutoConfiguration
.
class
))
"org.springframework.web.servlet.DispatcherServlet"
))
.
withUserConfiguration
(
TestConfiguration
.
class
)
.
withUserConfiguration
(
Test
Jersey
Configuration
.
class
)
.
run
((
context
)
->
assertThat
(
context
)
.
run
((
context
)
->
assertThat
(
context
)
.
doesNotHaveBean
(
MvcRequestMatcherProvider
.
class
));
.
getBean
(
RequestMatcherProvider
.
class
)
.
isInstanceOf
(
JerseyRequestMatcherProvider
.
class
));
}
}
@Test
@Test
...
@@ -65,12 +87,12 @@ public class SecurityRequestMatcherProviderAutoConfigurationTests {
...
@@ -65,12 +87,12 @@ public class SecurityRequestMatcherProviderAutoConfigurationTests {
}
}
@Test
@Test
public
void
mvcRequestMatcherProviderConditionalOnRequestMatcher
Class
()
{
public
void
jerseyRequestMatcherProviderConditionalOnResourceConfig
Class
()
{
this
.
contextRunner
this
.
contextRunner
.
withClassLoader
(
new
FilteredClassLoader
(
.
withClassLoader
(
new
FilteredClassLoader
(
"org.
springframework.security.web.util.matcher.RequestMatcher
"
))
"org.
glassfish.jersey.server.ResourceConfig
"
))
.
run
((
context
)
->
assertThat
(
context
)
.
run
((
context
)
->
assertThat
(
context
)
.
doesNotHaveBean
(
Mvc
RequestMatcherProvider
.
class
));
.
doesNotHaveBean
(
Jersey
RequestMatcherProvider
.
class
));
}
}
@Test
@Test
...
@@ -82,8 +104,19 @@ public class SecurityRequestMatcherProviderAutoConfigurationTests {
...
@@ -82,8 +104,19 @@ public class SecurityRequestMatcherProviderAutoConfigurationTests {
.
doesNotHaveBean
(
MvcRequestMatcherProvider
.
class
));
.
doesNotHaveBean
(
MvcRequestMatcherProvider
.
class
));
}
}
@Test
public
void
jerseyRequestMatcherProviderConditionalOnJerseyApplicationPathBean
()
{
new
WebApplicationContextRunner
()
.
withConfiguration
(
AutoConfigurations
.
of
(
SecurityRequestMatcherProviderAutoConfiguration
.
class
))
.
withClassLoader
(
new
FilteredClassLoader
(
"org.springframework.web.servlet.DispatcherServlet"
))
.
run
((
context
)
->
assertThat
(
context
)
.
doesNotHaveBean
(
JerseyRequestMatcherProvider
.
class
));
}
@Configuration
@Configuration
static
class
TestConfiguration
{
static
class
Test
Mvc
Configuration
{
@Bean
@Bean
public
HandlerMappingIntrospector
introspector
()
{
public
HandlerMappingIntrospector
introspector
()
{
...
@@ -92,4 +125,14 @@ public class SecurityRequestMatcherProviderAutoConfigurationTests {
...
@@ -92,4 +125,14 @@ public class SecurityRequestMatcherProviderAutoConfigurationTests {
}
}
@Configuration
static
class
TestJerseyConfiguration
{
@Bean
public
JerseyApplicationPath
jerseyApplicationPath
()
{
return
()
->
"/admin"
;
}
}
}
}
spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/JerseyApplicationPathTests.java
0 → 100644
View file @
fc6c07ad
/*
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
autoconfigure
.
web
.
servlet
;
import
org.junit.Test
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
/**
* Tests for {@link JerseyApplicationPath}.
*
* @author Madhura Bhave
*/
public
class
JerseyApplicationPathTests
{
@Test
public
void
getRelativePathReturnsRelativePath
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
"spring"
).
getRelativePath
(
"boot"
))
.
isEqualTo
(
"spring/boot"
);
assertThat
(((
JerseyApplicationPath
)
()
->
"spring/"
).
getRelativePath
(
"boot"
))
.
isEqualTo
(
"spring/boot"
);
assertThat
(((
JerseyApplicationPath
)
()
->
"spring"
).
getRelativePath
(
"/boot"
))
.
isEqualTo
(
"spring/boot"
);
assertThat
(((
JerseyApplicationPath
)
()
->
"spring/*"
).
getRelativePath
(
"/boot"
))
.
isEqualTo
(
"spring/boot"
);
}
@Test
public
void
getPrefixWhenHasSimplePathReturnPath
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
"spring"
).
getPrefix
())
.
isEqualTo
(
"spring"
);
}
@Test
public
void
getPrefixWhenHasPatternRemovesPattern
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
"spring/*.do"
).
getPrefix
())
.
isEqualTo
(
"spring"
);
}
@Test
public
void
getPrefixWhenPathEndsWithSlashRemovesSlash
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
"spring/"
).
getPrefix
())
.
isEqualTo
(
"spring"
);
}
@Test
public
void
getUrlMappingWhenPathIsEmptyReturnsSlash
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
""
).
getUrlMapping
()).
isEqualTo
(
"/*"
);
}
@Test
public
void
getUrlMappingWhenPathIsSlashReturnsSlash
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
"/"
).
getUrlMapping
()).
isEqualTo
(
"/*"
);
}
@Test
public
void
getUrlMappingWhenPathContainsStarReturnsPath
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
"/spring/*.do"
).
getUrlMapping
())
.
isEqualTo
(
"/spring/*.do"
);
}
@Test
public
void
getUrlMappingWhenHasPathNotEndingSlashReturnsSlashStarPattern
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
"/spring/boot"
).
getUrlMapping
())
.
isEqualTo
(
"/spring/boot/*"
);
}
@Test
public
void
getUrlMappingWhenHasPathDoesNotStartWithSlashPrependsSlash
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
"spring/boot"
).
getUrlMapping
())
.
isEqualTo
(
"/spring/boot/*"
);
}
@Test
public
void
getUrlMappingWhenHasPathEndingWithSlashReturnsSlashStarPattern
()
{
assertThat
(((
JerseyApplicationPath
)
()
->
"/spring/boot/"
).
getUrlMapping
())
.
isEqualTo
(
"/spring/boot/*"
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment