Skip to content

Commit 8b05d23

Browse files
committed
SEC-1971: Allow injection of ExpressionParser in AbstractSecurityExpressionHandler
1 parent 6584b65 commit 8b05d23

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

core/src/main/java/org/springframework/security/access/expression/AbstractSecurityExpressionHandler.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.springframework.security.access.PermissionEvaluator;
1212
import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
1313
import org.springframework.security.core.Authentication;
14+
import org.springframework.util.Assert;
1415

1516
/**
1617
* Base implementation of the facade which isolates Spring Security's requirements for evaluating security expressions
@@ -20,7 +21,7 @@
2021
* @since 3.1
2122
*/
2223
public abstract class AbstractSecurityExpressionHandler<T> implements SecurityExpressionHandler<T>, ApplicationContextAware {
23-
private final ExpressionParser expressionParser = new SpelExpressionParser();
24+
private ExpressionParser expressionParser = new SpelExpressionParser();
2425
private BeanResolver br;
2526
private RoleHierarchy roleHierarchy;
2627
private PermissionEvaluator permissionEvaluator = new DenyAllPermissionEvaluator();
@@ -29,6 +30,11 @@ public final ExpressionParser getExpressionParser() {
2930
return expressionParser;
3031
}
3132

33+
public final void setExpressionParser(ExpressionParser expressionParser) {
34+
Assert.notNull(expressionParser, "expressionParser cannot be null");
35+
this.expressionParser = expressionParser;
36+
}
37+
3238
/**
3339
* Invokes the internal template methods to create {@code StandardEvaluationContext} and {@code SecurityExpressionRoot}
3440
* objects.

core/src/test/java/org/springframework/security/access/expression/AbstractSecurityExpressionHandlerTests.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@
33
import static org.junit.Assert.assertTrue;
44
import static org.mockito.Mockito.mock;
55

6-
import org.junit.*;
7-
import org.springframework.context.ApplicationContext;
6+
import org.junit.Before;
7+
import org.junit.Test;
88
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
99
import org.springframework.context.annotation.Bean;
1010
import org.springframework.context.annotation.Configuration;
1111
import org.springframework.expression.Expression;
12+
import org.springframework.expression.spel.standard.SpelExpressionParser;
1213
import org.springframework.security.core.Authentication;
1314

14-
import java.util.*;
15-
1615
/**
1716
* @author Luke Taylor
1817
*/
@@ -36,6 +35,18 @@ public void beanNamesAreCorrectlyResolved() throws Exception {
3635
Expression expression = handler.getExpressionParser().parseExpression("@number10.compareTo(@number20) < 0");
3736
assertTrue((Boolean) expression.getValue(handler.createEvaluationContext(mock(Authentication.class), new Object())));
3837
}
38+
39+
@Test(expected=IllegalArgumentException.class)
40+
public void setExpressionParserNull() {
41+
handler.setExpressionParser(null);
42+
}
43+
44+
@Test
45+
public void setExpressionParser() {
46+
SpelExpressionParser parser = new SpelExpressionParser();
47+
handler.setExpressionParser(parser);
48+
assertTrue(parser == handler.getExpressionParser());
49+
}
3950
}
4051

4152
@Configuration

0 commit comments

Comments
 (0)