Skip to content

Commit cca54f7

Browse files
committed
Make SecurityExpressionRoot generic
Signed-off-by: Steve Riesenberg <[email protected]>
1 parent 04fdabe commit cca54f7

File tree

11 files changed

+156
-306
lines changed

11 files changed

+156
-306
lines changed

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

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -28,6 +28,8 @@
2828
import org.springframework.expression.spel.support.StandardEvaluationContext;
2929
import org.springframework.security.access.PermissionEvaluator;
3030
import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
31+
import org.springframework.security.authorization.AuthorizationManagerFactory;
32+
import org.springframework.security.authorization.DefaultAuthorizationManagerFactory;
3133
import org.springframework.security.core.Authentication;
3234
import org.springframework.util.Assert;
3335

@@ -47,7 +49,9 @@ public abstract class AbstractSecurityExpressionHandler<T>
4749

4850
private @Nullable BeanResolver beanResolver;
4951

50-
private @Nullable RoleHierarchy roleHierarchy;
52+
private final DefaultAuthorizationManagerFactory<T> defaultAuthorizationManagerFactory = new DefaultAuthorizationManagerFactory<>();
53+
54+
private AuthorizationManagerFactory<T> authorizationManagerFactory = defaultAuthorizationManagerFactory;
5155

5256
private PermissionEvaluator permissionEvaluator = new DenyAllPermissionEvaluator();
5357

@@ -105,12 +109,43 @@ protected StandardEvaluationContext createEvaluationContextInternal(Authenticati
105109
protected abstract SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication,
106110
T invocation);
107111

112+
/**
113+
* Sets the {@link AuthorizationManagerFactory} to be used. The default is
114+
* {@link DefaultAuthorizationManagerFactory}.
115+
* @param authorizationManagerFactory the {@link AuthorizationManagerFactory} to use.
116+
* Cannot be null.
117+
* @since 7.0
118+
*/
119+
public final void setAuthorizationManagerFactory(AuthorizationManagerFactory<T> authorizationManagerFactory) {
120+
Assert.notNull(authorizationManagerFactory, "authorizationManagerFactory cannot be null");
121+
this.authorizationManagerFactory = authorizationManagerFactory;
122+
}
123+
124+
protected final AuthorizationManagerFactory<T> getAuthorizationManagerFactory() {
125+
return this.authorizationManagerFactory;
126+
}
127+
128+
protected final DefaultAuthorizationManagerFactory<T> getDefaultAuthorizationManagerFactory() {
129+
return this.defaultAuthorizationManagerFactory;
130+
}
131+
132+
/**
133+
* @deprecated Use {@link #getDefaultAuthorizationManagerFactory()} instead
134+
*/
135+
@Deprecated(since = "7.0")
108136
protected @Nullable RoleHierarchy getRoleHierarchy() {
109-
return this.roleHierarchy;
137+
return this.defaultAuthorizationManagerFactory.getRoleHierarchy();
110138
}
111139

112-
public void setRoleHierarchy(RoleHierarchy roleHierarchy) {
113-
this.roleHierarchy = roleHierarchy;
140+
/**
141+
* @deprecated Use
142+
* {@link #setAuthorizationManagerFactory(AuthorizationManagerFactory)} instead
143+
*/
144+
@Deprecated(since = "7.0")
145+
public void setRoleHierarchy(@Nullable RoleHierarchy roleHierarchy) {
146+
if (roleHierarchy != null) {
147+
this.defaultAuthorizationManagerFactory.setRoleHierarchy(roleHierarchy);
148+
}
114149
}
115150

116151
protected PermissionEvaluator getPermissionEvaluator() {

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

Lines changed: 0 additions & 184 deletions
This file was deleted.

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

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,20 @@
3737
*
3838
* @author Luke Taylor
3939
* @author Evgeniy Cheban
40+
* @author Steve Riesenberg
4041
* @since 3.0
4142
*/
42-
public abstract class SecurityExpressionRoot implements SecurityExpressionOperations {
43+
public abstract class SecurityExpressionRoot<T> implements SecurityExpressionOperations {
4344

44-
private static final AuthorizationManagerFactory<Object> DEFAULT_AUTHORIZATION_MANAGER_FACTORY = new DefaultAuthorizationManagerFactory<>();
45-
46-
private static final Object DEFAULT_OBJECT = new Object();
45+
private static final AuthorizationManagerFactory<?> DEFAULT_AUTHORIZATION_MANAGER_FACTORY = new DefaultAuthorizationManagerFactory<>();
4746

4847
private final Supplier<Authentication> authentication;
4948

50-
private final Object object;
49+
private final @Nullable T object;
5150

52-
private @Nullable DefaultAuthorizationManagerFactory<Object> defaultAuthorizationManagerFactory;
51+
private @Nullable DefaultAuthorizationManagerFactory<T> defaultAuthorizationManagerFactory;
5352

54-
private AuthorizationManagerFactory<Object> authorizationManagerFactory = DEFAULT_AUTHORIZATION_MANAGER_FACTORY;
53+
private AuthorizationManagerFactory<T> authorizationManagerFactory = defaultAuthorizationManagerFactory();
5554

5655
/**
5756
* Allows "permitAll" expression
@@ -82,7 +81,7 @@ public abstract class SecurityExpressionRoot implements SecurityExpressionOperat
8281
*/
8382
@Deprecated(since = "7.0")
8483
public SecurityExpressionRoot(Authentication authentication) {
85-
this(() -> authentication, DEFAULT_OBJECT);
84+
this(() -> authentication);
8685
}
8786

8887
/**
@@ -95,7 +94,12 @@ public SecurityExpressionRoot(Authentication authentication) {
9594
*/
9695
@Deprecated(since = "7.0")
9796
public SecurityExpressionRoot(Supplier<Authentication> authentication) {
98-
this(authentication, DEFAULT_OBJECT);
97+
this.authentication = SingletonSupplier.of(() -> {
98+
Authentication value = authentication.get();
99+
Assert.notNull(value, "Authentication object cannot be null");
100+
return value;
101+
});
102+
this.object = null;
99103
}
100104

101105
/**
@@ -106,7 +110,7 @@ public SecurityExpressionRoot(Supplier<Authentication> authentication) {
106110
* @param object the object being authorized
107111
* @since 7.0
108112
*/
109-
public SecurityExpressionRoot(Supplier<Authentication> authentication, Object object) {
113+
public SecurityExpressionRoot(Supplier<Authentication> authentication, T object) {
110114
this.authentication = SingletonSupplier.of(() -> {
111115
Authentication value = authentication.get();
112116
Assert.notNull(value, "Authentication object cannot be null");
@@ -170,7 +174,8 @@ public final boolean isFullyAuthenticated() {
170174
return isGranted(this.authorizationManagerFactory.fullyAuthenticated());
171175
}
172176

173-
private boolean isGranted(AuthorizationManager<Object> authorizationManager) {
177+
@SuppressWarnings("DataFlowIssue")
178+
private boolean isGranted(AuthorizationManager<T> authorizationManager) {
174179
AuthorizationResult authorizationResult = authorizationManager.authorize(this.authentication, this.object);
175180
return (authorizationResult != null && authorizationResult.isGranted());
176181
}
@@ -228,12 +233,12 @@ public void setDefaultRolePrefix(String defaultRolePrefix) {
228233
* @param authorizationManagerFactory the {@link AuthorizationManagerFactory} to use
229234
* @since 7.0
230235
*/
231-
public void setAuthorizationManagerFactory(AuthorizationManagerFactory<Object> authorizationManagerFactory) {
236+
public void setAuthorizationManagerFactory(AuthorizationManagerFactory<T> authorizationManagerFactory) {
232237
Assert.notNull(authorizationManagerFactory, "authorizationManagerFactory cannot be null");
233238
this.authorizationManagerFactory = authorizationManagerFactory;
234239
}
235240

236-
private DefaultAuthorizationManagerFactory<Object> getDefaultAuthorizationManagerFactory() {
241+
private DefaultAuthorizationManagerFactory<T> getDefaultAuthorizationManagerFactory() {
237242
if (this.defaultAuthorizationManagerFactory == null) {
238243
this.defaultAuthorizationManagerFactory = new DefaultAuthorizationManagerFactory<>();
239244
this.authorizationManagerFactory = this.defaultAuthorizationManagerFactory;
@@ -258,4 +263,9 @@ public void setPermissionEvaluator(PermissionEvaluator permissionEvaluator) {
258263
this.permissionEvaluator = permissionEvaluator;
259264
}
260265

266+
@SuppressWarnings("unchecked")
267+
private static <T> AuthorizationManagerFactory<T> defaultAuthorizationManagerFactory() {
268+
return (AuthorizationManagerFactory<T>) DEFAULT_AUTHORIZATION_MANAGER_FACTORY;
269+
}
270+
261271
}

0 commit comments

Comments
 (0)