Skip to content

Commit 755dc6a

Browse files
authored
Merge branch '7.0.x' into renovate/spring-boot
2 parents 0b728c4 + e3accd9 commit 755dc6a

File tree

12 files changed

+145
-77
lines changed

12 files changed

+145
-77
lines changed

.github/workflows/gradle.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ on:
1010
- '[3-9]+.[3-9]+.x'
1111
workflow_dispatch:
1212
env:
13-
GIT_USER_NAME: puneetbehl
14-
GIT_USER_EMAIL: [email protected]
13+
GIT_USER_NAME: grails-build
14+
GIT_USER_EMAIL: [email protected]
1515

1616
jobs:
1717
core-tests:
@@ -70,6 +70,7 @@ jobs:
7070
spring-security-core:build
7171
--refresh-dependencies
7272
-Dgeb.env=chromeHeadless
73+
-x javadoc
7374
7475
- name: Publish Snapshot artifacts to Artifactory (repo.grails.org)
7576
uses: gradle/actions/setup-gradle@v3
@@ -82,6 +83,7 @@ jobs:
8283
arguments: |
8384
-Dorg.gradle.internal.publish.checksums.insecure=true
8485
spring-security-core:publish
86+
-x javadoc
8587
8688
- name: Generate Snapshot Documentation
8789
if: success()

.sdkmanrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
java=17.0.12-librca

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,18 @@ See [documentation](https://grails-plugins.github.io/grails-spring-security-core
1313
- `4.0.x` compatible with Grails 4
1414
- `3.3.x` compatible with Grails 3.3.x
1515
- `3.2.x` compatible with Grails 3.2.x
16+
17+
Grails 7 requires disabling any Spring Security Auto Configurations you may have in your classpath. This can be done via annotation or `application.yml`
18+
e.g.
19+
```yml
20+
spring:
21+
autoconfigure:
22+
exclude:
23+
- org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration
24+
- org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration
25+
- org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
26+
- org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration
27+
- org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration
28+
- org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration
29+
- org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
30+
```

buildSrc/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ repositories {
44
}
55

66
dependencies {
7+
implementation platform("org.grails:grails-bom:7.0.0-SNAPSHOT")
78
implementation buildsrcLibs.asciidoctorj
89
implementation buildsrcLibs.asset.pipeline.gradle
910
implementation buildsrcLibs.grails.gradle.plugin, {

examples/integration-test-app/src/integration-test/groovy/grails/plugin/springsecurity/SpringSecurityUtilsIntegrationSpec.groovy

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ class SpringSecurityUtilsIntegrationSpec extends AbstractIntegrationSpec {
8787
expect:
8888
10 == map.size()
8989
map[Integer.MIN_VALUE + 10] instanceof SecurityRequestHolderFilter
90-
map[300] instanceof SecurityContextPersistenceFilter
91-
map[400] instanceof MutableLogoutFilter
92-
map[800] instanceof GrailsUsernamePasswordAuthenticationFilter
93-
map[1400] instanceof SecurityContextHolderAwareRequestFilter
94-
map[1500] instanceof GrailsRememberMeAuthenticationFilter
95-
map[1600] instanceof GrailsAnonymousAuthenticationFilter
96-
map[1800] instanceof FormContentFilter
97-
map[1900] instanceof ExceptionTranslationFilter
98-
map[2000] instanceof FilterSecurityInterceptor
90+
map[SecurityFilterPosition.SECURITY_CONTEXT_FILTER.order] instanceof SecurityContextPersistenceFilter
91+
map[SecurityFilterPosition.LOGOUT_FILTER.order] instanceof MutableLogoutFilter
92+
map[SecurityFilterPosition.FORM_LOGIN_FILTER.order] instanceof GrailsUsernamePasswordAuthenticationFilter
93+
map[SecurityFilterPosition.SERVLET_API_SUPPORT_FILTER.order] instanceof SecurityContextHolderAwareRequestFilter
94+
map[SecurityFilterPosition.REMEMBER_ME_FILTER.order] instanceof GrailsRememberMeAuthenticationFilter
95+
map[SecurityFilterPosition.ANONYMOUS_FILTER.order] instanceof GrailsAnonymousAuthenticationFilter
96+
map[SecurityFilterPosition.EXCEPTION_TRANSLATION_FILTER.order-10] instanceof FormContentFilter
97+
map[SecurityFilterPosition.EXCEPTION_TRANSLATION_FILTER.order] instanceof ExceptionTranslationFilter
98+
map[SecurityFilterPosition.FILTER_SECURITY_INTERCEPTOR.order] instanceof FilterSecurityInterceptor
9999

100100
when:
101101
SpringSecurityUtils.clientRegisterFilter 'foo', SecurityFilterPosition.LOGOUT_FILTER
@@ -123,7 +123,7 @@ class SpringSecurityUtilsIntegrationSpec extends AbstractIntegrationSpec {
123123

124124
then:
125125
11 == map.size()
126-
map[410] instanceof DummyFilter
126+
map[SecurityFilterPosition.LOGOUT_FILTER.order + 10] instanceof DummyFilter
127127

128128
when:
129129
def filters = securityFilterChains[0].filters

gradle/libs.versions.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[versions]
22
asset-pipeline = '5.0.1'
3-
commons-lang = '2.6'
3+
commons-text = '1.12.0'
44
ehcache = '3.10.8'
55
geb = '7.0'
66
gorm-hibernate5 = '9.0.0-SNAPSHOT'
@@ -25,7 +25,7 @@ spring-security = '6.3.3'
2525
tomcat = '10.1.29'
2626

2727
[libraries]
28-
commons-lang = { module = 'commons-lang:commons-lang', version.ref = 'commons-lang' }
28+
commons-text = { module = 'org.apache.commons:commons-text', version.ref = 'commons-text' }
2929
ehcache = { module = 'org.ehcache:ehcache', version.ref = 'ehcache' }
3030
geb-core = { module = 'org.gebish:geb-core', version.ref = 'geb' }
3131
geb-spock = { module = 'org.gebish:geb-spock', version.ref = 'geb' }
@@ -76,6 +76,7 @@ spring-context-core = { module = 'org.springframework:spring-context', version.r
7676
spring-context-support = { module = 'org.springframework:spring-context-support', version.ref = 'spring' }
7777
spring-expression = { module = 'org.springframework:spring-expression', version.ref = 'spring' }
7878
spring-security-core = { module = 'org.springframework.security:spring-security-core', version.ref = 'spring-security' }
79+
spring-security-config = { module = 'org.springframework.security:spring-security-config', version.ref = 'spring-security' }
7980
spring-security-crypto = { module = 'org.springframework.security:spring-security-crypto', version.ref = 'spring-security' }
8081
spring-security-web = { module = 'org.springframework.security:spring-security-web', version.ref = 'spring-security' }
8182
spring-test = { module = 'org.springframework:spring-test', version.ref = 'spring' }

plugin/build.gradle

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,6 @@ plugins {
99

1010
group = 'org.grails.plugins'
1111

12-
configurations {
13-
all {
14-
exclude group: 'javax.servlet'
15-
}
16-
}
17-
1812
dependencies {
1913

2014
api libs.grails.core
@@ -32,7 +26,7 @@ dependencies {
3226
api libs.spring.security.web
3327
api libs.spring.web
3428

35-
implementation libs.commons.lang
29+
implementation libs.commons.text
3630
implementation libs.ehcache
3731
implementation libs.grails.bootstrap
3832
implementation libs.grails.converters
@@ -42,6 +36,7 @@ dependencies {
4236
implementation libs.spring.core
4337
implementation libs.spring.security.crypto
4438
implementation libs.spring.tx
39+
compileOnly "jline:jline" // for shell commands
4540

4641
compileOnly libs.groovy.core // Compile-time annotations
4742
compileOnly libs.jakarta.servlet.api // Provided
@@ -50,6 +45,7 @@ dependencies {
5045
testImplementation libs.bundles.grails.testing.support
5146
testImplementation libs.spock.core
5247
testImplementation libs.spring.test
48+
testImplementation libs.spring.security.config
5349

5450
testRuntimeOnly libs.slf4j.nop // Prevents warnings about missing slf4j implementation during tests
5551
}

plugin/src/main/groovy/grails/plugin/springsecurity/SecurityFilterPosition.groovy renamed to plugin/src/main/groovy/grails/plugin/springsecurity/SecurityFilterPosition.java

Lines changed: 72 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* See the License for the specific language governing permissions and
1313
* limitations under the License.
1414
*/
15-
package grails.plugin.springsecurity
15+
package grails.plugin.springsecurity;
1616

1717
/**
1818
* Stores the default order numbers of all Spring Security filters for use in configuration.
@@ -22,64 +22,100 @@
2222
*
2323
* @author Burt Beckwith
2424
*/
25-
enum SecurityFilterPosition {
26-
/** First */
25+
enum SecurityFilterPosition {
26+
2727
FIRST(Integer.MIN_VALUE),
28-
/** HTTP/HTTPS channel filter */
28+
29+
DISABLE_ENCODE_URL_FILTER,
30+
31+
FORCE_EAGER_SESSION_FILTER,
32+
2933
CHANNEL_FILTER,
30-
/** Concurrent Sessions */
31-
CONCURRENT_SESSION_FILTER,
32-
/** Populates the SecurityContextHolder */
34+
3335
SECURITY_CONTEXT_FILTER,
34-
/** Logout */
36+
37+
CONCURRENT_SESSION_FILTER,
38+
39+
WEB_ASYNC_MANAGER_FILTER,
40+
41+
HEADERS_FILTER,
42+
43+
CORS_FILTER,
44+
45+
SAML2_LOGOUT_REQUEST_FILTER,
46+
47+
SAML2_LOGOUT_RESPONSE_FILTER,
48+
49+
CSRF_FILTER,
50+
51+
SAML2_LOGOUT_FILTER,
52+
3553
LOGOUT_FILTER,
36-
/** x509 certs */
54+
55+
OAUTH2_AUTHORIZATION_REQUEST_FILTER,
56+
57+
SAML2_AUTHENTICATION_REQUEST_FILTER,
58+
3759
X509_FILTER,
38-
/** Pre-auth */
60+
3961
PRE_AUTH_FILTER,
40-
/** CAS */
62+
4163
CAS_FILTER,
42-
/** UsernamePasswordAuthenticationFilter */
64+
65+
OAUTH2_LOGIN_FILTER,
66+
67+
SAML2_AUTHENTICATION_FILTER,
68+
4369
FORM_LOGIN_FILTER,
44-
/** OpenID */
45-
OPENID_FILTER,
46-
/** Not used, generates a dynamic login form */
70+
4771
LOGIN_PAGE_FILTER,
48-
/** Digest auth */
72+
73+
LOGOUT_PAGE_FILTER,
74+
4975
DIGEST_AUTH_FILTER,
50-
/** Basic Auth */
76+
77+
BEARER_TOKEN_AUTH_FILTER,
78+
5179
BASIC_AUTH_FILTER,
52-
/** saved request filter */
80+
5381
REQUEST_CACHE_FILTER,
54-
/** SecurityContextHolderAwareRequestFilter */
82+
5583
SERVLET_API_SUPPORT_FILTER,
56-
/** Remember-me cookie */
84+
85+
JAAS_API_SUPPORT_FILTER,
86+
5787
REMEMBER_ME_FILTER,
58-
/** Anonymous auth */
88+
5989
ANONYMOUS_FILTER,
60-
/** SessionManagementFilter */
90+
91+
OAUTH2_AUTHORIZATION_CODE_GRANT_FILTER,
92+
93+
WELL_KNOWN_CHANGE_PASSWORD_REDIRECT_FILTER,
94+
6195
SESSION_MANAGEMENT_FILTER,
62-
/** Spring FormContentFilter allows www-url-form-encoded content-types to provide params in PUT requests */
63-
FORM_CONTENT_FILTER,
64-
/** ExceptionTranslationFilter */
96+
6597
EXCEPTION_TRANSLATION_FILTER,
66-
/** FilterSecurityInterceptor */
98+
6799
FILTER_SECURITY_INTERCEPTOR,
68-
/** Switch user */
100+
69101
SWITCH_USER_FILTER,
70-
/** Last */
71-
LAST(Integer.MAX_VALUE)
72102

73-
private static final int INTERVAL = 100
103+
LAST(Integer.MAX_VALUE);
104+
105+
private static final int INTERVAL = 100;
74106

75-
/** The position in the chain. */
76-
final int order
107+
private final int order;
77108

78-
private SecurityFilterPosition() {
79-
order = ordinal() * INTERVAL
109+
SecurityFilterPosition() {
110+
this.order = ordinal() * INTERVAL;
80111
}
81112

82-
private SecurityFilterPosition(int filterOrder) {
83-
order = filterOrder
113+
SecurityFilterPosition(int order) {
114+
this.order = order;
84115
}
116+
117+
public int getOrder() {
118+
return this.order;
119+
}
120+
85121
}

plugin/src/main/groovy/grails/plugin/springsecurity/SpringSecurityCoreGrailsPlugin.groovy

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import grails.plugins.Plugin
5757
import grails.util.Metadata
5858
import groovy.util.logging.Slf4j
5959
import org.grails.web.mime.HttpServletResponseExtension
60+
import org.springframework.boot.autoconfigure.security.SecurityProperties
6061
import org.springframework.boot.web.servlet.FilterRegistrationBean
6162
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean
6263
import org.springframework.cache.jcache.JCacheCacheManager
@@ -221,17 +222,7 @@ class SpringSecurityCoreGrailsPlugin extends Plugin {
221222
filter = ref('springSecurityFilterChain')
222223
urlPatterns = ['/*']
223224
dispatcherTypes = EnumSet.of(DispatcherType.ERROR, DispatcherType.REQUEST)
224-
225-
// The filter chain has to be after grailsWebRequestFilter, but its order changed
226-
// in 3.1 (from Ordered.HIGHEST_PRECEDENCE + 30 (-2147483618) to
227-
// FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER + 30 (30))
228-
String grailsVersion = Metadata.current.getGrailsVersion()
229-
if (grailsVersion.startsWith('3.0')) {
230-
order = Ordered.HIGHEST_PRECEDENCE + 100
231-
}
232-
else {
233-
order = 100 // FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER + 100
234-
}
225+
order = SecurityProperties.DEFAULT_FILTER_ORDER
235226
}
236227

237228
if (conf.useHttpSessionEventPublisher) {
@@ -673,6 +664,13 @@ to default to 'Annotation'; setting value to 'Annotation'
673664
// build filters here to give dependent plugins a chance to register some
674665
SortedMap<Integer, String> filterNames = ReflectionUtils.findFilterChainNames(conf)
675666
def securityFilterChains = applicationContext.securityFilterChains
667+
668+
// if sitemesh 3 is installed, the filter should be applied a second time
669+
// as part of the security filter chain so that pages are decorated using the security context
670+
if (applicationContext.containsBean('sitemesh')) {
671+
filterNames[SecurityFilterPosition.EXCEPTION_TRANSLATION_FILTER.order - 10] = 'sitemesh'
672+
}
673+
676674
SpringSecurityUtils.buildFilterChains filterNames, conf.filterChain.chainMap ?: [], securityFilterChains, applicationContext
677675
log.trace 'Filter chain: {}', securityFilterChains
678676

0 commit comments

Comments
 (0)