29
29
*
30
30
* @param <T> the type of object that the authorization check is being done on
31
31
* @author Steve Riesenberg
32
+ * @author Andrey Litvitski
32
33
* @since 7.0
33
34
*/
34
35
public final class DefaultAuthorizationManagerFactory <T extends @ Nullable Object >
@@ -40,6 +41,8 @@ public final class DefaultAuthorizationManagerFactory<T extends @Nullable Object
40
41
41
42
private String rolePrefix = "ROLE_" ;
42
43
44
+ private String [] requiredAuthorities = new String [0 ];
45
+
43
46
/**
44
47
* Sets the {@link AuthenticationTrustResolver} used to check the user's
45
48
* authentication.
@@ -69,49 +72,81 @@ public void setRolePrefix(String rolePrefix) {
69
72
this .rolePrefix = rolePrefix ;
70
73
}
71
74
75
+ /**
76
+ * Sets authorities required for authorization managers that apply to authenticated
77
+ * users.
78
+ * <p>
79
+ * Does not affect {@code anonymous}, {@code permitAll}, or {@code denyAll}.
80
+ * <p>
81
+ * Evaluated with the configured {@link RoleHierarchy}.
82
+ * @param requiredAuthorities the required authorities (must not be {@code null})
83
+ */
84
+ public void setRequiredAuthorities (String [] requiredAuthorities ) {
85
+ Assert .notNull (requiredAuthorities , "requiredAuthorities cannot be null" );
86
+ this .requiredAuthorities = requiredAuthorities ;
87
+ }
88
+
89
+ /**
90
+ * Creates a factory that requires the given authorities for authorization managers
91
+ * that apply to authenticated users.
92
+ * <p>
93
+ * Does not affect {@code anonymous}, {@code permitAll}, or {@code denyAll}.
94
+ * @param authorities the required authorities
95
+ * @param <T> the secured object type
96
+ * @return a factory configured with the required authorities
97
+ */
98
+ public static <T > AuthorizationManagerFactory <T > withAuthorities (String ... authorities ) {
99
+ DefaultAuthorizationManagerFactory <T > factory = new DefaultAuthorizationManagerFactory <>();
100
+ factory .setRequiredAuthorities (authorities );
101
+ return factory ;
102
+ }
103
+
72
104
@ Override
73
105
public AuthorizationManager <T > hasRole (String role ) {
74
106
return hasAnyRole (role );
75
107
}
76
108
77
109
@ Override
78
110
public AuthorizationManager <T > hasAnyRole (String ... roles ) {
79
- return withRoleHierarchy (AuthorityAuthorizationManager .hasAnyRole (this .rolePrefix , roles ));
111
+ return withRequiredAuthorities (
112
+ withRoleHierarchy (AuthorityAuthorizationManager .hasAnyRole (this .rolePrefix , roles )));
80
113
}
81
114
82
115
@ Override
83
116
public AuthorizationManager <T > hasAllRoles (String ... roles ) {
84
- return withRoleHierarchy (AllAuthoritiesAuthorizationManager .hasAllPrefixedAuthorities (this .rolePrefix , roles ));
117
+ return withRequiredAuthorities (withRoleHierarchy (
118
+ AllAuthoritiesAuthorizationManager .hasAllPrefixedAuthorities (this .rolePrefix , roles )));
85
119
}
86
120
87
121
@ Override
88
122
public AuthorizationManager <T > hasAuthority (String authority ) {
89
- return withRoleHierarchy (AuthorityAuthorizationManager .hasAuthority (authority ));
123
+ return withRequiredAuthorities ( withRoleHierarchy (AuthorityAuthorizationManager .hasAuthority (authority ) ));
90
124
}
91
125
92
126
@ Override
93
127
public AuthorizationManager <T > hasAnyAuthority (String ... authorities ) {
94
- return withRoleHierarchy (AuthorityAuthorizationManager .hasAnyAuthority (authorities ));
128
+ return withRequiredAuthorities ( withRoleHierarchy (AuthorityAuthorizationManager .hasAnyAuthority (authorities ) ));
95
129
}
96
130
97
131
@ Override
98
132
public AuthorizationManager <T > hasAllAuthorities (String ... authorities ) {
99
- return withRoleHierarchy (AllAuthoritiesAuthorizationManager .hasAllAuthorities (authorities ));
133
+ return withRequiredAuthorities (
134
+ withRoleHierarchy (AllAuthoritiesAuthorizationManager .hasAllAuthorities (authorities )));
100
135
}
101
136
102
137
@ Override
103
138
public AuthorizationManager <T > authenticated () {
104
- return withTrustResolver (AuthenticatedAuthorizationManager .authenticated ());
139
+ return withRequiredAuthorities ( withTrustResolver (AuthenticatedAuthorizationManager .authenticated () ));
105
140
}
106
141
107
142
@ Override
108
143
public AuthorizationManager <T > fullyAuthenticated () {
109
- return withTrustResolver (AuthenticatedAuthorizationManager .fullyAuthenticated ());
144
+ return withRequiredAuthorities ( withTrustResolver (AuthenticatedAuthorizationManager .fullyAuthenticated () ));
110
145
}
111
146
112
147
@ Override
113
148
public AuthorizationManager <T > rememberMe () {
114
- return withTrustResolver (AuthenticatedAuthorizationManager .rememberMe ());
149
+ return withRequiredAuthorities ( withTrustResolver (AuthenticatedAuthorizationManager .rememberMe () ));
115
150
}
116
151
117
152
@ Override
@@ -136,4 +171,13 @@ private AuthenticatedAuthorizationManager<T> withTrustResolver(
136
171
return authorizationManager ;
137
172
}
138
173
174
+ private AuthorizationManager <T > withRequiredAuthorities (AuthorizationManager <T > manager ) {
175
+ if (this .requiredAuthorities == null || this .requiredAuthorities .length == 0 ) {
176
+ return manager ;
177
+ }
178
+ AuthorizationManager <T > required = withRoleHierarchy (
179
+ AllAuthoritiesAuthorizationManager .hasAllAuthorities (this .requiredAuthorities ));
180
+ return AuthorizationManagers .allOf (new AuthorizationDecision (false ), manager , required );
181
+ }
182
+
139
183
}
0 commit comments