Skip to content

Commit d0ab35a

Browse files
committed
Grails 7
1 parent ac5162f commit d0ab35a

File tree

67 files changed

+417
-183
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+417
-183
lines changed

.github/workflows/gradle.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
- uses: actions/checkout@v4
2222
- uses: gradle/wrapper-validation-action@v2
2323
- uses: actions/setup-java@v4
24-
with: { java-version: 11, distribution: temurin }
24+
with: { java-version: 17, distribution: temurin }
2525
- name: Run Tests
2626
uses: gradle/actions/setup-gradle@v3
2727
env:
@@ -36,11 +36,11 @@ jobs:
3636
runs-on: ubuntu-latest
3737
strategy:
3838
matrix:
39-
test-config: [ 'static', 'annotation', 'requestmap', 'basic', 'misc', 'putWithParams', 'bcrypt', 'issue503' ]
39+
test-config: [ 'static', 'annotation', 'requestmap', 'basic', 'basicCacheUsers', 'misc', 'putWithParams', 'bcrypt', 'issue503' ]
4040
steps:
4141
- uses: actions/checkout@v4
4242
- uses: actions/setup-java@v4
43-
with: { java-version: 11, distribution: temurin }
43+
with: { java-version: 17, distribution: temurin }
4444
- name: Run Tests
4545
uses: gradle/actions/setup-gradle@v3
4646
env:
@@ -58,7 +58,7 @@ jobs:
5858
- uses: actions/checkout@v4
5959
- uses: gradle/wrapper-validation-action@v2
6060
- uses: actions/setup-java@v4
61-
with: { java-version: 11, distribution: temurin }
61+
with: { java-version: 17, distribution: temurin }
6262
- name: Run Build
6363
id: build
6464
uses: gradle/actions/setup-gradle@v3

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ See [documentation](https://grails-plugins.github.io/grails-spring-security-core
77

88
### Branch structure
99

10+
- `7.0.x` compatible with Grails 7
1011
- `6.0.x` compatible with Grails 6
1112
- `5.0.x` compatible with Grails 5
1213
- `4.0.x` compatible with Grails 4

build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ if (isReleaseVersion) {
2828
subprojects {
2929
version = rootProject.version
3030
repositories {
31+
mavenLocal()
3132
mavenCentral()
3233
maven { url = 'https://repo.grails.org/grails/core' }
3334
if (libs.versions.groovy.get().endsWith('-SNAPSHOT')) {

buildSrc/build.gradle

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
repositories {
2+
mavenLocal()
23
mavenCentral()
34
maven { url = 'https://repo.grails.org/grails/core' }
45
}
@@ -9,7 +10,7 @@ dependencies {
910
implementation buildsrcLibs.grails.gradle.plugin, {
1011
// Grails Gradle plugin leaks groovy-xml onto compile classpath
1112
// which is causes a version conflict for Gradle
12-
exclude group: 'org.codehaus.groovy', module: 'groovy-xml'
13+
exclude group: 'org.apache.groovy', module: 'groovy-xml'
1314
}
1415
implementation buildsrcLibs.webdriver.binaries.gradle.plugin
1516

@@ -19,3 +20,5 @@ dependencies {
1920
tasks.withType(Test).configureEach {
2021
useJUnitPlatform()
2122
}
23+
24+
apply from: rootProject.layout.projectDirectory.file('../gradle/buildsrc-groovy-config.gradle')

examples/functional-test-app/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ dependencies {
3636
runtimeOnly libs.tomcat.jdbc
3737

3838
compileOnly libs.micronaut.inject.groovy
39-
compileOnly libs.javax.annotation.api
40-
compileOnly libs.javax.servlet.api
39+
compileOnly libs.jakarta.annotation.api
40+
compileOnly libs.jakarta.servlet.api
4141
compileOnly libs.slf4j.nop // Prevent warnings about missing SLF4j implementation during GSP compilation
4242
}
4343

examples/functional-test-app/grails-app/conf/application.groovy

+12
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@ switch (testconfig) {
4949
]
5050
break
5151

52+
case 'basicCacheUsers':
53+
grails.plugin.springsecurity.securityConfigType = 'Annotation'
54+
grails.plugin.springsecurity.useBasicAuth = true
55+
grails.plugin.springsecurity.basic.realmName = 'Grails Spring Security Basic Test Realm'
56+
grails.plugin.springsecurity.filterChain.chainMap = [
57+
[pattern: '/secureclassannotated/**', filters: 'JOINED_FILTERS,-exceptionTranslationFilter'],
58+
[pattern: '/**', filters: 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter']
59+
]
60+
grails.plugin.springsecurity.cacheUsers = true
61+
grails.plugin.springsecurity.providerManager.eraseCredentialsAfterAuthentication = false
62+
break
63+
5264
case 'bcrypt':
5365
grails.plugin.springsecurity.securityConfigType = 'Annotation'
5466
grails.plugin.springsecurity.password.algorithm = 'bcrypt'

examples/functional-test-app/grails-app/views/error.gsp

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<g:if test="${Throwable.isInstance(exception)}">
77
<g:renderException exception="${exception}" />
88
</g:if>
9-
<g:elseif test="${request.getAttribute('javax.servlet.error.exception')}">
10-
<g:renderException exception="${request.getAttribute('javax.servlet.error.exception')}" />
9+
<g:elseif test="${request.getAttribute('jakarta.servlet.error.exception')}">
10+
<g:renderException exception="${request.getAttribute('jakarta.servlet.error.exception')}" />
1111
</g:elseif>
1212
<g:else>
1313
<ul class="errors">
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
package specs
2+
3+
import org.springframework.security.core.userdetails.UserCache
4+
import pages.LoginPage
5+
import pages.role.CreateRolePage
6+
import pages.role.ListRolePage
7+
import pages.role.ShowRolePage
8+
import pages.user.CreateUserPage
9+
import pages.user.ListUserPage
10+
import pages.user.ShowUserPage
11+
import spock.lang.IgnoreIf
12+
13+
@IgnoreIf({ System.getProperty('TESTCONFIG') != 'basicCacheUsers' })
14+
class BasicAuthCacheUsersSecuritySpec extends AbstractSecuritySpec {
15+
16+
private HttpURLConnection connection
17+
UserCache userCache
18+
19+
void 'create roles'() {
20+
when:
21+
to ListRolePage
22+
23+
then:
24+
roleRows.size() == 0
25+
26+
when:
27+
newRoleButton.click()
28+
29+
then:
30+
at CreateRolePage
31+
32+
when:
33+
authority = 'ROLE_ADMIN'
34+
createButton.click()
35+
36+
then:
37+
at ShowRolePage
38+
39+
when:
40+
to ListRolePage
41+
42+
then:
43+
roleRows.size() == 1
44+
45+
when:
46+
newRoleButton.click()
47+
48+
then:
49+
at CreateRolePage
50+
51+
when:
52+
authority = 'ROLE_ADMIN2'
53+
createButton.click()
54+
55+
then:
56+
at ShowRolePage
57+
58+
when:
59+
to ListRolePage
60+
61+
then:
62+
roleRows.size() == 2
63+
}
64+
65+
void 'create users'() {
66+
when:
67+
to ListUserPage
68+
69+
then:
70+
userRows.size() == 0
71+
72+
when:
73+
newUserButton.click()
74+
75+
then:
76+
at CreateUserPage
77+
78+
when:
79+
username = 'admin1'
80+
password = 'password1'
81+
$('#enabled').click()
82+
$('#ROLE_ADMIN').click()
83+
createButton.click()
84+
85+
then:
86+
at ShowUserPage
87+
88+
when:
89+
to ListUserPage
90+
91+
then:
92+
userRows.size() == 1
93+
94+
when:
95+
newUserButton.click()
96+
97+
then:
98+
at CreateUserPage
99+
100+
when:
101+
username = 'admin2'
102+
password = 'password2'
103+
$('#enabled').click()
104+
$('#ROLE_ADMIN').click()
105+
$('#ROLE_ADMIN2').click()
106+
createButton.click()
107+
108+
then:
109+
at ShowUserPage
110+
111+
when:
112+
to ListUserPage
113+
114+
then:
115+
userRows.size() == 2
116+
}
117+
118+
@IgnoreIf({ !System.getProperty('geb.env') })
119+
void 'check userDetails caching'() {
120+
121+
when:
122+
go 'secureAnnotated'
123+
124+
then:
125+
at LoginPage
126+
127+
when:
128+
login 'admin1', 'password1'
129+
130+
then:
131+
assertContentContains 'you have ROLE_ADMIN'
132+
133+
and:
134+
userCache.getUserFromCache('admin1')
135+
136+
cleanup:
137+
logout()
138+
}
139+
140+
protected void logout() {
141+
super.logout()
142+
// cheesy, but the 'Authentication' header from basic auth
143+
// isn't cleared, so this forces an invalid header
144+
getWithAuth '', 'not_a_valid_username', ''
145+
}
146+
147+
private void getWithAuth(String path, String username, String password) {
148+
String uri = new URI(baseUrlRequired).resolve(new URI(path))
149+
go uri.replace('http://', 'http://' + username + ':' + password + '@')
150+
}
151+
}

examples/functional-test-app/src/integration-test/groovy/specs/RoleSpec.groovy

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import spock.lang.IgnoreIf
99
@IgnoreIf({ !(
1010
System.getProperty('TESTCONFIG') == 'annotation' ||
1111
System.getProperty('TESTCONFIG') == 'basic' ||
12+
System.getProperty('TESTCONFIG') == 'basicCacheUsers' ||
1213
System.getProperty('TESTCONFIG') == 'requestmap' ||
1314
System.getProperty('TESTCONFIG') == 'static')
1415
})

examples/functional-test-app/src/integration-test/groovy/specs/UserSpec.groovy

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import spock.lang.IgnoreIf
99
@IgnoreIf({ !(
1010
System.getProperty('TESTCONFIG') == 'annotation' ||
1111
System.getProperty('TESTCONFIG') == 'basic' ||
12+
System.getProperty('TESTCONFIG') == 'basicCacheUsers' ||
1213
System.getProperty('TESTCONFIG') == 'requestmap' ||
1314
System.getProperty('TESTCONFIG') == 'static')
1415
})

examples/functional-test-app/src/main/groovy/com/testapp/MaintenanceModeFilter.groovy

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ package com.testapp
33
import groovy.util.logging.Slf4j
44
import org.springframework.web.filter.GenericFilterBean
55

6-
import javax.servlet.FilterChain
7-
import javax.servlet.ServletException
8-
import javax.servlet.ServletRequest
9-
import javax.servlet.ServletResponse
10-
import javax.servlet.http.HttpServletRequest
11-
import javax.servlet.http.HttpServletResponse
6+
import jakarta.servlet.FilterChain
7+
import jakarta.servlet.ServletException
8+
import jakarta.servlet.ServletRequest
9+
import jakarta.servlet.ServletResponse
10+
import jakarta.servlet.http.HttpServletRequest
11+
import jakarta.servlet.http.HttpServletResponse
1212

1313
/**
1414
* If registered, this filter results in an HttpStatus of 500 being returned to the client

examples/functional-test-app/src/main/groovy/com/testapp/TestUserPasswordEncoderListener.groovy

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import org.grails.datastore.mapping.engine.event.PreUpdateEvent
77
import org.springframework.beans.factory.annotation.Autowired
88
import grails.events.annotation.gorm.Listener
99
import groovy.transform.CompileStatic
10-
import javax.annotation.PostConstruct
10+
import jakarta.annotation.PostConstruct
1111

1212
@CompileStatic
1313
class TestUserPasswordEncoderListener {

examples/integration-test-app/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ dependencies {
3333
runtimeOnly libs.tomcat.jdbc
3434

3535
compileOnly libs.micronaut.inject.groovy
36-
compileOnly libs.javax.servlet.api
36+
compileOnly libs.jakarta.servlet.api
3737
compileOnly libs.slf4j.nop
3838

3939
testImplementation libs.spock.core

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ import org.springframework.web.context.request.RequestContextHolder
3434
import spock.lang.Ignore
3535
import spock.lang.Shared
3636

37-
import javax.servlet.FilterChain
38-
import javax.servlet.ServletContext
37+
import jakarta.servlet.FilterChain
38+
import jakarta.servlet.ServletContext
3939
import java.security.Principal
4040

4141
/**

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ import test.TestRole
3636
import test.TestUser
3737
import test.TestUserRole
3838

39-
import javax.servlet.FilterChain
40-
import javax.servlet.ServletRequest
41-
import javax.servlet.ServletResponse
39+
import jakarta.servlet.FilterChain
40+
import jakarta.servlet.ServletRequest
41+
import jakarta.servlet.ServletResponse
4242

4343
/**
4444
* Integration tests for <code>SpringSecurityUtils</code>.

examples/integration-test-app/src/main/groovy/com/test/AdditionalLogoutHandler.groovy

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.test
22

3-
import javax.servlet.http.HttpServletRequest
4-
import javax.servlet.http.HttpServletResponse
3+
import jakarta.servlet.http.HttpServletRequest
4+
import jakarta.servlet.http.HttpServletResponse
55

66
import org.springframework.security.core.Authentication
77
import org.springframework.security.web.authentication.logout.LogoutHandler

gradle/buildsrc-groovy-config.gradle

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
configurations.configureEach {
2+
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
3+
if ((details.requested.group == 'org.codehaus.groovy' || details.requested.group == 'org.apache.groovy') && details.requested.name != 'groovy-bom') {
4+
String groovyVersion = findProperty('groovyVersion') ?: buildsrcLibs.versions.groovy.get()
5+
details.useTarget(group: 'org.apache.groovy', name: details.requested.name, version: groovyVersion)
6+
details.because "The dependency coordinates are changed in Apache Groovy 4, plus ensure version"
7+
}
8+
}
9+
}

gradle/buildsrc.libs.versions.toml

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
[versions]
2-
asciidoctorj = '4.0.2'
3-
asset-pipeline-gradle = '4.4.0'
4-
grails-gradle-plugin = '6.1.2'
2+
asciidoctorj = '4.0.3'
3+
asset-pipeline-gradle = '5.0.0'
4+
grails-gradle-plugin = '7.0.0-SNAPSHOT'
55
webdriver-binaries = '3.2'
6-
spock = '2.3-groovy-3.0'
6+
spock = '2.4-M4-groovy-3.0'
7+
groovy = '4.0.22'
78

89
[libraries]
910
asciidoctorj = { module = 'org.asciidoctor:asciidoctor-gradle-jvm', version.ref = 'asciidoctorj' }

gradle/groovy-config.gradle

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
configurations.configureEach {
22
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
3-
if (details.requested.group == 'org.codehaus.groovy') {
3+
if ((details.requested.group == 'org.codehaus.groovy' || details.requested.group == 'org.apache.groovy') && details.requested.name != 'groovy-bom') {
44
String groovyVersion = findProperty('groovyVersion') ?: libs.versions.groovy.get()
5-
details.useVersion(groovyVersion)
5+
details.useTarget(group: 'org.apache.groovy', name: details.requested.name, version: groovyVersion)
6+
details.because "The dependency coordinates are changed in Apache Groovy 4, plus ensure version"
67
}
78
}
89
}

gradle/java-config.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
java {
2-
sourceCompatibility = JavaVersion.VERSION_11
2+
sourceCompatibility = JavaVersion.VERSION_17
33
withJavadocJar()
44
withSourcesJar()
55
}

0 commit comments

Comments
 (0)