1
1
/*
2
- * Copyright 2002-2022 the original author or authors.
2
+ * Copyright 2002-2024 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
30
30
31
31
import org .springframework .core .DefaultParameterNameDiscoverer ;
32
32
import org .springframework .core .MethodParameter ;
33
- import org .springframework .core .ResolvableType ;
34
33
import org .springframework .core .annotation .SynthesizingMethodParameter ;
35
34
import org .springframework .graphql .data .method .annotation .Argument ;
36
35
import org .springframework .graphql .data .method .annotation .QueryMapping ;
54
53
* Tests for {@link AuthenticationPrincipalArgumentResolver}.
55
54
*
56
55
* @author Rob Winch
56
+ * @author Rossen Stoyanchev
57
57
*/
58
58
class AuthenticationPrincipalArgumentResolverTests {
59
59
60
- private static final Class <String > STRING_CLASS = String .class ;
61
-
62
- private static final Class <UserDetails > USER_DETAILS_CLASS = UserDetails .class ;
63
-
64
- private static final Class <?> MONO_USER_DETAILS_CLASS =
65
- ResolvableType .forClassWithGenerics (Mono .class , UserDetails .class ).getRawClass ();
66
-
67
- private static final Class <?> MONO_STRING_CLASS =
68
- ResolvableType .forClassWithGenerics (Mono .class , String .class ).getRawClass ();
69
-
70
- private static final Class <?> PUBLISHER_USER_DETAILS_CLASS =
71
- ResolvableType .forClassWithGenerics (Publisher .class , UserDetails .class ).getRawClass ();
72
-
73
- private static final Class <?> TESTPUBLISHER_USER_DETAILS_CLASS =
74
- ResolvableType .forClassWithGenerics (TestPublisher .class , UserDetails .class ).getRawClass ();
75
-
76
-
77
60
private final AuthenticationPrincipalArgumentResolver resolver =
78
61
new AuthenticationPrincipalArgumentResolver ((beanName , context ) -> new PrincipalConverter ());
79
62
@@ -83,48 +66,49 @@ void cleanup() {
83
66
SecurityContextHolder .clearContext ();
84
67
}
85
68
69
+
86
70
@ Test
87
71
void supportsParameterWhenNoAnnotation () {
88
- MethodParameter parameter = firstParameter (UserController .class , "noParameter" , USER_DETAILS_CLASS );
72
+ MethodParameter parameter = firstParameter (UserController .class , "noParameter" , UserDetails . class );
89
73
assertThat (this .resolver .supportsParameter (parameter )).isFalse ();
90
74
}
91
75
92
76
@ Test
93
77
void supportsParameterWhenWrongAnnotation () {
94
- MethodParameter parameter = firstParameter (UserController .class , "argument" , USER_DETAILS_CLASS );
78
+ MethodParameter parameter = firstParameter (UserController .class , "argument" , UserDetails . class );
95
79
assertThat (this .resolver .supportsParameter (parameter )).isFalse ();
96
80
}
97
81
98
82
@ Test
99
83
void supportsParameterWhenCurrentUser () {
100
- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , USER_DETAILS_CLASS );
84
+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , UserDetails . class );
101
85
assertThat (this .resolver .supportsParameter (parameter )).isTrue ();
102
86
}
103
87
104
88
@ Test
105
89
void supportsParameterWhenAuthenticationPrincipal () {
106
- MethodParameter parameter = firstParameter (UserController .class , "userDetails" , USER_DETAILS_CLASS );
90
+ MethodParameter parameter = firstParameter (UserController .class , "userDetails" , UserDetails . class );
107
91
assertThat (this .resolver .supportsParameter (parameter )).isTrue ();
108
92
}
109
93
110
94
@ Test
111
95
void resolveArgumentWhenAuthenticationPrincipal () throws Exception {
112
- MethodParameter parameter = firstParameter (UserController .class , "userDetails" , USER_DETAILS_CLASS );
113
- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
96
+ MethodParameter parameter = firstParameter (UserController .class , "userDetails" , UserDetails . class );
97
+ Mono <UserDetails > details = resolveArgument (parameter );
114
98
assertThat (details .contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
115
99
}
116
100
117
101
@ Test
118
102
void resolveArgumentWhenCurrentUser () throws Exception {
119
- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , USER_DETAILS_CLASS );
120
- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
103
+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , UserDetails . class );
104
+ Mono <UserDetails > details = resolveArgument (parameter );
121
105
assertThat (details .contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
122
106
}
123
107
124
108
@ Test
125
109
void resolveArgumentWhenNoSecurityContext () throws Exception {
126
- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , USER_DETAILS_CLASS );
127
- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
110
+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , UserDetails . class );
111
+ Mono <UserDetails > details = resolveArgument (parameter );
128
112
assertThat (details .block ()).isNull ();
129
113
}
130
114
@@ -133,82 +117,82 @@ void resolveArgumentWhenSecurityContextHolder() throws Exception {
133
117
SecurityContext context = SecurityContextHolder .createEmptyContext ();
134
118
context .setAuthentication (usernamePasswordAuthentication ());
135
119
SecurityContextHolder .setContext (context );
136
- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , USER_DETAILS_CLASS );
137
- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
120
+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , UserDetails . class );
121
+ Mono <UserDetails > details = resolveArgument (parameter );
138
122
assertThat (details .contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
139
123
}
140
124
141
125
@ Test
142
126
void resolveArgumentWhenAuthenticationPrincipalUsername () throws Exception {
143
- MethodParameter parameter = firstParameter (UserController .class , "username" , STRING_CLASS );
144
- Mono <String > details = ( Mono < String >) this . resolver . resolveArgument (parameter , null );
127
+ MethodParameter parameter = firstParameter (UserController .class , "username" , String . class );
128
+ Mono <String > details = resolveArgument (parameter );
145
129
assertThat (details .contextWrite (authenticationContext ()).block ()).isEqualTo ("user" );
146
130
}
147
131
148
132
@ Test
149
133
void resolveArgumentWhenBeanName () throws Exception {
150
- MethodParameter parameter = firstParameter (UserController .class , "beanName" , USER_DETAILS_CLASS );
151
- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
134
+ MethodParameter parameter = firstParameter (UserController .class , "beanName" , UserDetails . class );
135
+ Mono <UserDetails > details = resolveArgument (parameter );
152
136
assertThat (details .contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
153
137
}
154
138
155
139
@ Test
156
140
void resolveArgumentWhenErrorOnInvalidType () throws Exception {
157
141
MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , String .class );
158
- Mono <Object > details = ( Mono < Object >) this . resolver . resolveArgument (parameter , null );
142
+ Mono <Object > details = resolveArgument (parameter );
159
143
assertThatExceptionOfType (ClassCastException .class )
160
144
.isThrownBy (() -> details .contextWrite (authenticationContext ()).block ());
161
145
}
162
146
163
147
@ Test
164
148
void resolveArgumentWhenInvalidType () throws Exception {
165
- MethodParameter parameter = firstParameter (UserController .class , "invalidType" , STRING_CLASS );
166
- Mono <Mono <Object >> details = ( Mono < Mono < Object >>) this . resolver . resolveArgument (parameter , null );
149
+ MethodParameter parameter = firstParameter (UserController .class , "invalidType" , String . class );
150
+ Mono <Mono <Object >> details = resolveArgument (parameter );
167
151
assertThat (details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ()).isNull ();
168
152
}
169
153
170
154
@ Test
171
155
void supportsParameterWhenMonoNoAnnotation () {
172
- MethodParameter parameter = firstParameter (UserController .class , "noParameter" , MONO_USER_DETAILS_CLASS );
156
+ MethodParameter parameter = firstParameter (UserController .class , "noParameter" , Mono . class );
173
157
assertThat (this .resolver .supportsParameter (parameter )).isFalse ();
174
158
}
175
159
176
160
@ Test
177
161
void supportsParameterWhenMonoWrongAnnotation () {
178
- MethodParameter parameter = firstParameter (UserController .class , "argument" , MONO_USER_DETAILS_CLASS );
162
+ MethodParameter parameter = firstParameter (UserController .class , "argument" , Mono . class );
179
163
assertThat (this .resolver .supportsParameter (parameter )).isFalse ();
180
164
}
181
165
182
166
@ Test
183
167
void supportsParameterWhenMonoCurrentUser () {
184
- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , MONO_USER_DETAILS_CLASS );
168
+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , Mono . class );
185
169
assertThat (this .resolver .supportsParameter (parameter )).isTrue ();
186
170
}
187
171
188
172
@ Test
189
173
void supportsParameterWhenMonoAuthenticationPrincipal () {
190
- MethodParameter parameter = firstParameter (UserController .class , "userDetails" , MONO_USER_DETAILS_CLASS );
174
+ MethodParameter parameter = firstParameter (UserController .class , "userDetails" , Mono . class );
191
175
assertThat (this .resolver .supportsParameter (parameter )).isTrue ();
192
176
}
193
177
194
178
@ Test
195
179
void resolveArgumentWhenMonoAuthenticationPrincipal () throws Exception {
196
- MethodParameter parameter = firstParameter (UserController .class , "userDetails" , MONO_USER_DETAILS_CLASS );
197
- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
180
+ MethodParameter parameter = firstParameter (UserController .class , "userDetails" , Mono . class );
181
+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
198
182
assertThat (details .block ().contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
199
183
}
200
184
201
185
@ Test
202
186
void resolveArgumentWhenMonoCurrentUser () throws Exception {
203
- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , MONO_USER_DETAILS_CLASS );
204
- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
187
+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , Mono . class );
188
+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
205
189
assertThat (details .block ().contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
206
190
}
207
191
208
192
@ Test
209
193
void resolveArgumentWhenMonoNoSecurityContext () throws Exception {
210
- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , MONO_USER_DETAILS_CLASS );
211
- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
194
+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , Mono . class );
195
+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
212
196
assertThat (details .block ().block ()).isNull ();
213
197
}
214
198
@@ -217,58 +201,58 @@ void resolveArgumentWhenMonoSecurityContextHolder() throws Exception {
217
201
SecurityContext context = SecurityContextHolder .createEmptyContext ();
218
202
context .setAuthentication (usernamePasswordAuthentication ());
219
203
SecurityContextHolder .setContext (context );
220
- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , MONO_USER_DETAILS_CLASS );
221
- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
204
+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , Mono . class );
205
+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
222
206
assertThat (details .block ().contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
223
207
}
224
208
225
209
@ Test
226
210
void resolveArgumentWhenMonoAuthenticationPrincipalUsername () throws Exception {
227
- MethodParameter parameter = firstParameter (UserController .class , "username" , MONO_STRING_CLASS );
228
- Mono <Mono <String >> details = ( Mono < Mono < String >>) this . resolver . resolveArgument (parameter , null );
211
+ MethodParameter parameter = firstParameter (UserController .class , "username" , Mono . class );
212
+ Mono <Mono <String >> details = resolveArgument (parameter );
229
213
assertThat (details .block ().contextWrite (authenticationContext ()).block ()).isEqualTo ("user" );
230
214
}
231
215
232
216
@ Test
233
217
void resolveArgumentWhenMonoBeanName () throws Exception {
234
- MethodParameter parameter = firstParameter (UserController .class , "beanName" , MONO_USER_DETAILS_CLASS );
235
- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
218
+ MethodParameter parameter = firstParameter (UserController .class , "beanName" , Mono . class );
219
+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
236
220
assertThat (details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
237
221
}
238
222
239
223
@ Test
240
224
void resolveArgumentWhenMonoErrorOnInvalidType () throws Exception {
241
- MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , MONO_STRING_CLASS );
242
- Mono <Mono <Object >> details = ( Mono < Mono < Object >>) this . resolver . resolveArgument (parameter , null );
225
+ MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , Mono . class );
226
+ Mono <Mono <Object >> details = resolveArgument (parameter );
243
227
assertThatExceptionOfType (ClassCastException .class )
244
228
.isThrownBy (() -> details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ());
245
229
}
246
230
247
231
@ Test
248
232
void resolveArgumentWhenMonoInvalidType () throws Exception {
249
- MethodParameter parameter = firstParameter (UserController .class , "invalidType" , MONO_STRING_CLASS );
250
- Mono <Mono <Object >> details = ( Mono < Mono < Object >>) this . resolver . resolveArgument (parameter , null );
233
+ MethodParameter parameter = firstParameter (UserController .class , "invalidType" , Mono . class );
234
+ Mono <Mono <Object >> details = resolveArgument (parameter );
251
235
assertThat (details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ()).isNull ();
252
236
}
253
237
254
238
@ Test
255
239
void resolveArgumentWhenPublisher () throws Exception {
256
- MethodParameter parameter = firstParameter (UserController .class , "publisher" , PUBLISHER_USER_DETAILS_CLASS );
257
- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
240
+ MethodParameter parameter = firstParameter (UserController .class , "publisher" , Publisher . class );
241
+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
258
242
assertThat (details .block ().contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
259
243
}
260
244
261
245
@ Test
262
246
void resolveArgumentWhenTestPublisherThenEmptyMono () throws Exception {
263
- MethodParameter parameter = firstParameter (UserController .class , "publisher" , TESTPUBLISHER_USER_DETAILS_CLASS );
264
- Mono <TestPublisher <UserDetails >> details = ( Mono < TestPublisher < UserDetails >>) this . resolver . resolveArgument (parameter , null );
247
+ MethodParameter parameter = firstParameter (UserController .class , "publisher" , TestPublisher . class );
248
+ Mono <TestPublisher <UserDetails >> details = resolveArgument (parameter );
265
249
assertThat (details .contextWrite (authenticationContext ()).block ()).isNull ();
266
250
}
267
251
268
252
@ Test
269
253
void resolveArgumentWhenTestPublisherAndErrorOnInvalidType () throws Exception {
270
- MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , TESTPUBLISHER_USER_DETAILS_CLASS );
271
- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
254
+ MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , TestPublisher . class );
255
+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
272
256
assertThatExceptionOfType (ClassCastException .class )
273
257
.isThrownBy (() -> details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ());
274
258
}
@@ -284,6 +268,11 @@ private MethodParameter methodParam(Method method, int index) {
284
268
return parameter ;
285
269
}
286
270
271
+ @ SuppressWarnings ({"unchecked" , "DataFlowIssue" })
272
+ private <T > T resolveArgument (MethodParameter parameter ) throws Exception {
273
+ return (T ) this .resolver .resolveArgument (parameter , null );
274
+ }
275
+
287
276
private static Function <Context , Context > authenticationContext () {
288
277
return (context ) -> ReactiveSecurityContextHolder .withAuthentication (usernamePasswordAuthentication ());
289
278
}
@@ -297,6 +286,7 @@ private static UserDetails userDetails() {
297
286
return new User ("user" , "password" , AuthorityUtils .createAuthorityList ("ROLE_USER" ));
298
287
}
299
288
289
+
300
290
static class PrincipalConverter {
301
291
public UserDetails convert (UserDetails userDetails ) {
302
292
return userDetails ;
0 commit comments