16
16
17
17
package org .springframework .security .config .annotation .method .configuration ;
18
18
19
+ import java .util .function .Consumer ;
19
20
import java .util .function .Supplier ;
20
21
21
22
import io .micrometer .observation .ObservationRegistry ;
23
+ import org .aopalliance .aop .Advice ;
22
24
import org .aopalliance .intercept .MethodInterceptor ;
23
25
import org .aopalliance .intercept .MethodInvocation ;
26
+ import org .jetbrains .annotations .NotNull ;
27
+ import org .jetbrains .annotations .Nullable ;
24
28
29
+ import org .springframework .aop .Pointcut ;
30
+ import org .springframework .aop .PointcutAdvisor ;
31
+ import org .springframework .aop .framework .AopInfrastructureBean ;
25
32
import org .springframework .beans .factory .ObjectProvider ;
26
33
import org .springframework .beans .factory .config .BeanDefinition ;
27
34
import org .springframework .context .ApplicationContext ;
28
35
import org .springframework .context .annotation .Bean ;
29
36
import org .springframework .context .annotation .Configuration ;
30
37
import org .springframework .context .annotation .ImportAware ;
31
38
import org .springframework .context .annotation .Role ;
39
+ import org .springframework .core .Ordered ;
32
40
import org .springframework .core .type .AnnotationMetadata ;
33
- import org .springframework .expression .EvaluationContext ;
34
- import org .springframework .expression .Expression ;
35
- import org .springframework .expression .ExpressionParser ;
36
41
import org .springframework .security .access .expression .method .DefaultMethodSecurityExpressionHandler ;
37
42
import org .springframework .security .access .expression .method .MethodSecurityExpressionHandler ;
38
43
import org .springframework .security .access .hierarchicalroles .NullRoleHierarchy ;
47
52
import org .springframework .security .authorization .method .PreFilterAuthorizationMethodInterceptor ;
48
53
import org .springframework .security .authorization .method .PrePostTemplateDefaults ;
49
54
import org .springframework .security .config .core .GrantedAuthorityDefaults ;
50
- import org .springframework .security .core .Authentication ;
51
55
import org .springframework .security .core .context .SecurityContextHolderStrategy ;
52
56
import org .springframework .util .function .SingletonSupplier ;
53
57
@@ -76,11 +80,12 @@ static MethodInterceptor preFilterAuthorizationMethodInterceptor(
76
80
ApplicationContext context ) {
77
81
PreFilterAuthorizationMethodInterceptor preFilter = new PreFilterAuthorizationMethodInterceptor ();
78
82
preFilter .setOrder (preFilter .getOrder () + configuration .interceptorOrderOffset );
79
- strategyProvider .ifAvailable (preFilter ::setSecurityContextHolderStrategy );
80
- methodSecurityDefaultsProvider .ifAvailable (preFilter ::setTemplateDefaults );
81
- preFilter .setExpressionHandler (new DeferringMethodSecurityExpressionHandler (expressionHandlerProvider ,
82
- defaultsProvider , roleHierarchyProvider , context ));
83
- return preFilter ;
83
+ return new DeferringMethodInterceptor <>(preFilter , (f ) -> {
84
+ methodSecurityDefaultsProvider .ifAvailable (f ::setTemplateDefaults );
85
+ f .setExpressionHandler (expressionHandlerProvider
86
+ .getIfAvailable (() -> defaultExpressionHandler (defaultsProvider , roleHierarchyProvider , context )));
87
+ strategyProvider .ifAvailable (f ::setSecurityContextHolderStrategy );
88
+ });
84
89
}
85
90
86
91
@ Bean
@@ -94,15 +99,16 @@ static MethodInterceptor preAuthorizeAuthorizationMethodInterceptor(
94
99
ObjectProvider <ObservationRegistry > registryProvider , ObjectProvider <RoleHierarchy > roleHierarchyProvider ,
95
100
PrePostMethodSecurityConfiguration configuration , ApplicationContext context ) {
96
101
PreAuthorizeAuthorizationManager manager = new PreAuthorizeAuthorizationManager ();
97
- methodSecurityDefaultsProvider .ifAvailable (manager ::setTemplateDefaults );
98
- manager .setExpressionHandler (new DeferringMethodSecurityExpressionHandler (expressionHandlerProvider ,
99
- defaultsProvider , roleHierarchyProvider , context ));
100
102
AuthorizationManagerBeforeMethodInterceptor preAuthorize = AuthorizationManagerBeforeMethodInterceptor
101
103
.preAuthorize (manager (manager , registryProvider ));
102
104
preAuthorize .setOrder (preAuthorize .getOrder () + configuration .interceptorOrderOffset );
103
- strategyProvider .ifAvailable (preAuthorize ::setSecurityContextHolderStrategy );
104
- eventPublisherProvider .ifAvailable (preAuthorize ::setAuthorizationEventPublisher );
105
- return preAuthorize ;
105
+ return new DeferringMethodInterceptor <>(preAuthorize , (f ) -> {
106
+ methodSecurityDefaultsProvider .ifAvailable (manager ::setTemplateDefaults );
107
+ manager .setExpressionHandler (expressionHandlerProvider
108
+ .getIfAvailable (() -> defaultExpressionHandler (defaultsProvider , roleHierarchyProvider , context )));
109
+ strategyProvider .ifAvailable (f ::setSecurityContextHolderStrategy );
110
+ eventPublisherProvider .ifAvailable (f ::setAuthorizationEventPublisher );
111
+ });
106
112
}
107
113
108
114
@ Bean
@@ -116,15 +122,16 @@ static MethodInterceptor postAuthorizeAuthorizationMethodInterceptor(
116
122
ObjectProvider <ObservationRegistry > registryProvider , ObjectProvider <RoleHierarchy > roleHierarchyProvider ,
117
123
PrePostMethodSecurityConfiguration configuration , ApplicationContext context ) {
118
124
PostAuthorizeAuthorizationManager manager = new PostAuthorizeAuthorizationManager ();
119
- methodSecurityDefaultsProvider .ifAvailable (manager ::setTemplateDefaults );
120
- manager .setExpressionHandler (new DeferringMethodSecurityExpressionHandler (expressionHandlerProvider ,
121
- defaultsProvider , roleHierarchyProvider , context ));
122
125
AuthorizationManagerAfterMethodInterceptor postAuthorize = AuthorizationManagerAfterMethodInterceptor
123
126
.postAuthorize (manager (manager , registryProvider ));
124
127
postAuthorize .setOrder (postAuthorize .getOrder () + configuration .interceptorOrderOffset );
125
- strategyProvider .ifAvailable (postAuthorize ::setSecurityContextHolderStrategy );
126
- eventPublisherProvider .ifAvailable (postAuthorize ::setAuthorizationEventPublisher );
127
- return postAuthorize ;
128
+ return new DeferringMethodInterceptor <>(postAuthorize , (f ) -> {
129
+ methodSecurityDefaultsProvider .ifAvailable (manager ::setTemplateDefaults );
130
+ manager .setExpressionHandler (expressionHandlerProvider
131
+ .getIfAvailable (() -> defaultExpressionHandler (defaultsProvider , roleHierarchyProvider , context )));
132
+ strategyProvider .ifAvailable (f ::setSecurityContextHolderStrategy );
133
+ eventPublisherProvider .ifAvailable (f ::setAuthorizationEventPublisher );
134
+ });
128
135
}
129
136
130
137
@ Bean
@@ -138,11 +145,12 @@ static MethodInterceptor postFilterAuthorizationMethodInterceptor(
138
145
ApplicationContext context ) {
139
146
PostFilterAuthorizationMethodInterceptor postFilter = new PostFilterAuthorizationMethodInterceptor ();
140
147
postFilter .setOrder (postFilter .getOrder () + configuration .interceptorOrderOffset );
141
- strategyProvider .ifAvailable (postFilter ::setSecurityContextHolderStrategy );
142
- methodSecurityDefaultsProvider .ifAvailable (postFilter ::setTemplateDefaults );
143
- postFilter .setExpressionHandler (new DeferringMethodSecurityExpressionHandler (expressionHandlerProvider ,
144
- defaultsProvider , roleHierarchyProvider , context ));
145
- return postFilter ;
148
+ return new DeferringMethodInterceptor <>(postFilter , (f ) -> {
149
+ methodSecurityDefaultsProvider .ifAvailable (f ::setTemplateDefaults );
150
+ f .setExpressionHandler (expressionHandlerProvider
151
+ .getIfAvailable (() -> defaultExpressionHandler (defaultsProvider , roleHierarchyProvider , context )));
152
+ strategyProvider .ifAvailable (f ::setSecurityContextHolderStrategy );
153
+ });
146
154
}
147
155
148
156
private static MethodSecurityExpressionHandler defaultExpressionHandler (
@@ -167,42 +175,48 @@ public void setImportMetadata(AnnotationMetadata importMetadata) {
167
175
this .interceptorOrderOffset = annotation .offset ();
168
176
}
169
177
170
- private static final class DeferringMethodSecurityExpressionHandler implements MethodSecurityExpressionHandler {
178
+ private static final class DeferringMethodInterceptor <M extends Ordered & MethodInterceptor & PointcutAdvisor >
179
+ implements Ordered , MethodInterceptor , PointcutAdvisor , AopInfrastructureBean {
171
180
172
- private final Supplier < MethodSecurityExpressionHandler > expressionHandler ;
181
+ private final Pointcut pointcut ;
173
182
174
- private DeferringMethodSecurityExpressionHandler (
175
- ObjectProvider <MethodSecurityExpressionHandler > expressionHandlerProvider ,
176
- ObjectProvider <GrantedAuthorityDefaults > defaultsProvider ,
177
- ObjectProvider <RoleHierarchy > roleHierarchyProvider , ApplicationContext applicationContext ) {
178
- this .expressionHandler = SingletonSupplier .of (() -> expressionHandlerProvider .getIfAvailable (
179
- () -> defaultExpressionHandler (defaultsProvider , roleHierarchyProvider , applicationContext )));
183
+ private final int order ;
184
+
185
+ private final Supplier <M > delegate ;
186
+
187
+ DeferringMethodInterceptor (M delegate , Consumer <M > supplier ) {
188
+ this .pointcut = delegate .getPointcut ();
189
+ this .order = delegate .getOrder ();
190
+ this .delegate = SingletonSupplier .of (() -> {
191
+ supplier .accept (delegate );
192
+ return delegate ;
193
+ });
180
194
}
181
195
196
+ @ Nullable
182
197
@ Override
183
- public ExpressionParser getExpressionParser () {
184
- return this .expressionHandler .get ().getExpressionParser ( );
198
+ public Object invoke ( @ NotNull MethodInvocation invocation ) throws Throwable {
199
+ return this .delegate .get ().invoke ( invocation );
185
200
}
186
201
187
202
@ Override
188
- public EvaluationContext createEvaluationContext ( Authentication authentication , MethodInvocation invocation ) {
189
- return this .expressionHandler . get (). createEvaluationContext ( authentication , invocation ) ;
203
+ public Pointcut getPointcut ( ) {
204
+ return this .pointcut ;
190
205
}
191
206
192
207
@ Override
193
- public EvaluationContext createEvaluationContext (Supplier <Authentication > authentication ,
194
- MethodInvocation invocation ) {
195
- return this .expressionHandler .get ().createEvaluationContext (authentication , invocation );
208
+ public Advice getAdvice () {
209
+ return this ;
196
210
}
197
211
198
212
@ Override
199
- public Object filter ( Object filterTarget , Expression filterExpression , EvaluationContext ctx ) {
200
- return this .expressionHandler . get (). filter ( filterTarget , filterExpression , ctx ) ;
213
+ public int getOrder ( ) {
214
+ return this .order ;
201
215
}
202
216
203
217
@ Override
204
- public void setReturnObject ( Object returnObject , EvaluationContext ctx ) {
205
- this . expressionHandler . get (). setReturnObject ( returnObject , ctx ) ;
218
+ public boolean isPerInstance ( ) {
219
+ return true ;
206
220
}
207
221
208
222
}
0 commit comments