1
1
/*
2
- * Copyright 2002-2018 the original author or authors.
2
+ * Copyright 2002-2022 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.
21
21
import org .w3c .dom .Element ;
22
22
23
23
import org .springframework .aop .config .AopNamespaceUtils ;
24
+ import org .springframework .beans .BeanMetadataElement ;
24
25
import org .springframework .beans .BeansException ;
25
26
import org .springframework .beans .factory .FactoryBean ;
26
27
import org .springframework .beans .factory .config .BeanDefinition ;
28
+ import org .springframework .beans .factory .config .RuntimeBeanReference ;
27
29
import org .springframework .beans .factory .parsing .CompositeComponentDefinition ;
28
30
import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
29
31
import org .springframework .beans .factory .xml .BeanDefinitionParser ;
41
43
import org .springframework .security .authorization .method .PreFilterAuthorizationMethodInterceptor ;
42
44
import org .springframework .security .config .Elements ;
43
45
import org .springframework .security .config .core .GrantedAuthorityDefaults ;
46
+ import org .springframework .security .core .context .SecurityContextHolder ;
47
+ import org .springframework .security .core .context .SecurityContextHolderStrategy ;
48
+ import org .springframework .util .StringUtils ;
44
49
import org .springframework .util .xml .DomUtils ;
45
50
46
51
/**
@@ -61,26 +66,33 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
61
66
62
67
private static final String ATT_REF = "ref" ;
63
68
69
+ private static final String ATT_SECURITY_CONTEXT_HOLDER_STRATEGY_REF = "security-context-holder-strategy-ref" ;
70
+
64
71
@ Override
65
72
public BeanDefinition parse (Element element , ParserContext pc ) {
66
73
CompositeComponentDefinition compositeDef = new CompositeComponentDefinition (element .getTagName (),
67
74
pc .extractSource (element ));
68
75
pc .pushContainingComponent (compositeDef );
76
+ BeanMetadataElement securityContextHolderStrategy = getSecurityContextHolderStrategy (element );
69
77
boolean prePostAnnotationsEnabled = !element .hasAttribute (ATT_USE_PREPOST )
70
78
|| "true" .equals (element .getAttribute (ATT_USE_PREPOST ));
71
79
if (prePostAnnotationsEnabled ) {
72
80
BeanDefinitionBuilder preFilterInterceptor = BeanDefinitionBuilder
73
81
.rootBeanDefinition (PreFilterAuthorizationMethodInterceptor .class )
74
- .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
82
+ .setRole (BeanDefinition .ROLE_INFRASTRUCTURE )
83
+ .addPropertyValue ("securityContextHolderStrategy" , securityContextHolderStrategy );
75
84
BeanDefinitionBuilder preAuthorizeInterceptor = BeanDefinitionBuilder
76
85
.rootBeanDefinition (PreAuthorizeAuthorizationMethodInterceptor .class )
77
- .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
86
+ .setRole (BeanDefinition .ROLE_INFRASTRUCTURE )
87
+ .addPropertyValue ("securityContextHolderStrategy" , securityContextHolderStrategy );
78
88
BeanDefinitionBuilder postAuthorizeInterceptor = BeanDefinitionBuilder
79
89
.rootBeanDefinition (PostAuthorizeAuthorizationMethodInterceptor .class )
80
- .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
90
+ .setRole (BeanDefinition .ROLE_INFRASTRUCTURE )
91
+ .addPropertyValue ("securityContextHolderStrategy" , securityContextHolderStrategy );
81
92
BeanDefinitionBuilder postFilterInterceptor = BeanDefinitionBuilder
82
93
.rootBeanDefinition (PostFilterAuthorizationMethodInterceptor .class )
83
- .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
94
+ .setRole (BeanDefinition .ROLE_INFRASTRUCTURE )
95
+ .addPropertyValue ("securityContextHolderStrategy" , securityContextHolderStrategy );
84
96
Element expressionHandlerElt = DomUtils .getChildElementByTagName (element , Elements .EXPRESSION_HANDLER );
85
97
if (expressionHandlerElt != null ) {
86
98
String expressionHandlerRef = expressionHandlerElt .getAttribute (ATT_REF );
@@ -110,15 +122,18 @@ public BeanDefinition parse(Element element, ParserContext pc) {
110
122
if (securedEnabled ) {
111
123
BeanDefinitionBuilder securedInterceptor = BeanDefinitionBuilder
112
124
.rootBeanDefinition (AuthorizationManagerBeforeMethodInterceptor .class )
113
- .setRole (BeanDefinition .ROLE_INFRASTRUCTURE ).setFactoryMethod ("secured" );
125
+ .setRole (BeanDefinition .ROLE_INFRASTRUCTURE )
126
+ .addPropertyValue ("securityContextHolderStrategy" , securityContextHolderStrategy )
127
+ .setFactoryMethod ("secured" );
114
128
pc .getRegistry ().registerBeanDefinition ("securedAuthorizationMethodInterceptor" ,
115
129
securedInterceptor .getBeanDefinition ());
116
130
}
117
131
boolean jsr250Enabled = "true" .equals (element .getAttribute (ATT_USE_JSR250 ));
118
132
if (jsr250Enabled ) {
119
133
BeanDefinitionBuilder jsr250Interceptor = BeanDefinitionBuilder
120
134
.rootBeanDefinition (Jsr250AuthorizationMethodInterceptor .class )
121
- .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
135
+ .setRole (BeanDefinition .ROLE_INFRASTRUCTURE )
136
+ .addPropertyValue ("securityContextHolderStrategy" , securityContextHolderStrategy );
122
137
pc .getRegistry ().registerBeanDefinition ("jsr250AuthorizationMethodInterceptor" ,
123
138
jsr250Interceptor .getBeanDefinition ());
124
139
}
@@ -127,6 +142,14 @@ public BeanDefinition parse(Element element, ParserContext pc) {
127
142
return null ;
128
143
}
129
144
145
+ private BeanMetadataElement getSecurityContextHolderStrategy (Element methodSecurityElmt ) {
146
+ String holderStrategyRef = methodSecurityElmt .getAttribute (ATT_SECURITY_CONTEXT_HOLDER_STRATEGY_REF );
147
+ if (StringUtils .hasText (holderStrategyRef )) {
148
+ return new RuntimeBeanReference (holderStrategyRef );
149
+ }
150
+ return BeanDefinitionBuilder .rootBeanDefinition (SecurityContextHolderStrategyFactory .class ).getBeanDefinition ();
151
+ }
152
+
130
153
public static final class MethodSecurityExpressionHandlerBean
131
154
implements FactoryBean <MethodSecurityExpressionHandler >, ApplicationContextAware {
132
155
@@ -158,11 +181,17 @@ public void setApplicationContext(ApplicationContext applicationContext) throws
158
181
public static final class Jsr250AuthorizationMethodInterceptor
159
182
implements FactoryBean <AuthorizationManagerBeforeMethodInterceptor >, ApplicationContextAware {
160
183
184
+ private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder
185
+ .getContextHolderStrategy ();
186
+
161
187
private final Jsr250AuthorizationManager manager = new Jsr250AuthorizationManager ();
162
188
163
189
@ Override
164
190
public AuthorizationManagerBeforeMethodInterceptor getObject () {
165
- return AuthorizationManagerBeforeMethodInterceptor .jsr250 (this .manager );
191
+ AuthorizationManagerBeforeMethodInterceptor interceptor = AuthorizationManagerBeforeMethodInterceptor
192
+ .jsr250 (this .manager );
193
+ interceptor .setSecurityContextHolderStrategy (this .securityContextHolderStrategy );
194
+ return interceptor ;
166
195
}
167
196
168
197
@ Override
@@ -181,23 +210,37 @@ public void setApplicationContext(ApplicationContext applicationContext) throws
181
210
}
182
211
}
183
212
213
+ public void setSecurityContextHolderStrategy (SecurityContextHolderStrategy securityContextHolderStrategy ) {
214
+ this .securityContextHolderStrategy = securityContextHolderStrategy ;
215
+ }
216
+
184
217
}
185
218
186
219
public static final class PreAuthorizeAuthorizationMethodInterceptor
187
220
implements FactoryBean <AuthorizationManagerBeforeMethodInterceptor > {
188
221
222
+ private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder
223
+ .getContextHolderStrategy ();
224
+
189
225
private final PreAuthorizeAuthorizationManager manager = new PreAuthorizeAuthorizationManager ();
190
226
191
227
@ Override
192
228
public AuthorizationManagerBeforeMethodInterceptor getObject () {
193
- return AuthorizationManagerBeforeMethodInterceptor .preAuthorize (this .manager );
229
+ AuthorizationManagerBeforeMethodInterceptor interceptor = AuthorizationManagerBeforeMethodInterceptor
230
+ .preAuthorize (this .manager );
231
+ interceptor .setSecurityContextHolderStrategy (this .securityContextHolderStrategy );
232
+ return interceptor ;
194
233
}
195
234
196
235
@ Override
197
236
public Class <?> getObjectType () {
198
237
return AuthorizationManagerBeforeMethodInterceptor .class ;
199
238
}
200
239
240
+ public void setSecurityContextHolderStrategy (SecurityContextHolderStrategy securityContextHolderStrategy ) {
241
+ this .securityContextHolderStrategy = securityContextHolderStrategy ;
242
+ }
243
+
201
244
public void setExpressionHandler (MethodSecurityExpressionHandler expressionHandler ) {
202
245
this .manager .setExpressionHandler (expressionHandler );
203
246
}
@@ -207,22 +250,46 @@ public void setExpressionHandler(MethodSecurityExpressionHandler expressionHandl
207
250
public static final class PostAuthorizeAuthorizationMethodInterceptor
208
251
implements FactoryBean <AuthorizationManagerAfterMethodInterceptor > {
209
252
253
+ private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder
254
+ .getContextHolderStrategy ();
255
+
210
256
private final PostAuthorizeAuthorizationManager manager = new PostAuthorizeAuthorizationManager ();
211
257
212
258
@ Override
213
259
public AuthorizationManagerAfterMethodInterceptor getObject () {
214
- return AuthorizationManagerAfterMethodInterceptor .postAuthorize (this .manager );
260
+ AuthorizationManagerAfterMethodInterceptor interceptor = AuthorizationManagerAfterMethodInterceptor
261
+ .postAuthorize (this .manager );
262
+ interceptor .setSecurityContextHolderStrategy (this .securityContextHolderStrategy );
263
+ return interceptor ;
215
264
}
216
265
217
266
@ Override
218
267
public Class <?> getObjectType () {
219
268
return AuthorizationManagerAfterMethodInterceptor .class ;
220
269
}
221
270
271
+ public void setSecurityContextHolderStrategy (SecurityContextHolderStrategy securityContextHolderStrategy ) {
272
+ this .securityContextHolderStrategy = securityContextHolderStrategy ;
273
+ }
274
+
222
275
public void setExpressionHandler (MethodSecurityExpressionHandler expressionHandler ) {
223
276
this .manager .setExpressionHandler (expressionHandler );
224
277
}
225
278
226
279
}
227
280
281
+ static class SecurityContextHolderStrategyFactory implements FactoryBean <SecurityContextHolderStrategy > {
282
+
283
+ @ Override
284
+ public SecurityContextHolderStrategy getObject () throws Exception {
285
+ return SecurityContextHolder .getContextHolderStrategy ();
286
+ }
287
+
288
+ @ Override
289
+ public Class <?> getObjectType () {
290
+ return SecurityContextHolderStrategy .class ;
291
+ }
292
+
293
+ }
294
+
228
295
}
0 commit comments