Skip to content
This repository was archived by the owner on May 31, 2022. It is now read-only.

Commit 4288519

Browse files
committed
Publish OAuth2MethodSecurityExpressionHandler Bean
Closes gh-336
1 parent 66520f6 commit 4288519

File tree

4 files changed

+83
-12
lines changed

4 files changed

+83
-12
lines changed

spring-security-oauth2-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/OAuth2AutoConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import org.springframework.boot.autoconfigure.security.oauth2.authserver.OAuth2AuthorizationServerConfiguration;
2323
import org.springframework.boot.autoconfigure.security.oauth2.client.ClientProperties;
2424
import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2RestOperationsConfiguration;
25-
import org.springframework.boot.autoconfigure.security.oauth2.method.OAuth2MethodSecurityConfiguration;
25+
import org.springframework.boot.autoconfigure.security.oauth2.method.OAuth2MethodSecurityExpressionHandlerConfiguration;
2626
import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerConfiguration;
2727
import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties;
2828
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
@@ -42,7 +42,7 @@
4242
*/
4343
@Configuration
4444
@ConditionalOnClass({ OAuth2AccessToken.class, WebMvcConfigurer.class })
45-
@Import({ OAuth2AuthorizationServerConfiguration.class, OAuth2MethodSecurityConfiguration.class,
45+
@Import({ OAuth2AuthorizationServerConfiguration.class, OAuth2MethodSecurityExpressionHandlerConfiguration.class,
4646
OAuth2ResourceServerConfiguration.class, OAuth2RestOperationsConfiguration.class })
4747
@AutoConfigureBefore(WebMvcAutoConfiguration.class)
4848
@EnableConfigurationProperties({ OAuth2ClientProperties.class, ClientProperties.class })

spring-security-oauth2-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/method/OAuth2MethodSecurityConfiguration.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2017 the original author or authors.
2+
* Copyright 2012-2021 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.
@@ -33,8 +33,8 @@
3333
import org.springframework.security.oauth2.provider.expression.OAuth2MethodSecurityExpressionHandler;
3434

3535
/**
36-
* Auto-configure an expression handler for method-level security (if the user already has
37-
* {@code @EnableGlobalMethodSecurity}).
36+
* Replace any {@link DefaultMethodSecurityExpressionHandler} in the application context
37+
* with an {@link OAuth2MethodSecurityExpressionHandler}.
3838
*
3939
* @author Greg Turnquist
4040
* @author Dave Syer
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright 2012-2021 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.security.oauth2.method;
18+
19+
import org.springframework.beans.factory.annotation.Autowired;
20+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
21+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
22+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
23+
import org.springframework.context.ApplicationContext;
24+
import org.springframework.context.annotation.Bean;
25+
import org.springframework.context.annotation.Configuration;
26+
import org.springframework.security.access.PermissionEvaluator;
27+
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
28+
import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
29+
import org.springframework.security.authentication.AuthenticationTrustResolver;
30+
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;
31+
import org.springframework.security.config.core.GrantedAuthorityDefaults;
32+
import org.springframework.security.oauth2.common.OAuth2AccessToken;
33+
import org.springframework.security.oauth2.provider.expression.OAuth2MethodSecurityExpressionHandler;
34+
35+
/**
36+
* Auto-configure an expression handler for method-level security (if the application is
37+
* already annotated with {@code @EnableGlobalMethodSecurity}).
38+
*
39+
* @author Josh Cummings
40+
* @since 2.6
41+
*/
42+
@Configuration(proxyBeanMethods = false)
43+
@ConditionalOnClass({ OAuth2AccessToken.class })
44+
@ConditionalOnBean(GlobalMethodSecurityConfiguration.class)
45+
public class OAuth2MethodSecurityExpressionHandlerConfiguration {
46+
47+
@Bean
48+
@ConditionalOnMissingBean(MethodSecurityExpressionHandler.class)
49+
MethodSecurityExpressionHandler methodSecurityExpressionHandler(@Autowired ApplicationContext context,
50+
@Autowired(required = false) PermissionEvaluator permissionEvaluator,
51+
@Autowired(required = false) RoleHierarchy roleHierarchy,
52+
@Autowired(required = false) AuthenticationTrustResolver trustResolver,
53+
@Autowired(required = false) GrantedAuthorityDefaults grantedAuthorityDefaults) {
54+
OAuth2MethodSecurityExpressionHandler expressionHandler = new OAuth2MethodSecurityExpressionHandler();
55+
expressionHandler.setApplicationContext(context);
56+
if (permissionEvaluator != null) {
57+
expressionHandler.setPermissionEvaluator(permissionEvaluator);
58+
}
59+
if (roleHierarchy != null) {
60+
expressionHandler.setRoleHierarchy(roleHierarchy);
61+
}
62+
if (trustResolver != null) {
63+
expressionHandler.setTrustResolver(trustResolver);
64+
}
65+
if (grantedAuthorityDefaults != null) {
66+
expressionHandler.setDefaultRolePrefix(grantedAuthorityDefaults.getRolePrefix());
67+
}
68+
return expressionHandler;
69+
}
70+
71+
}

spring-security-oauth2-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/OAuth2AutoConfigurationTests.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2019 the original author or authors.
2+
* Copyright 2012-2021 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.
@@ -27,11 +27,11 @@
2727
import org.springframework.aop.support.AopUtils;
2828
import org.springframework.beans.factory.annotation.Autowired;
2929
import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration;
30-
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
3130
import org.springframework.boot.autoconfigure.security.oauth2.authserver.OAuth2AuthorizationServerConfiguration;
32-
import org.springframework.boot.autoconfigure.security.oauth2.method.OAuth2MethodSecurityConfiguration;
31+
import org.springframework.boot.autoconfigure.security.oauth2.method.OAuth2MethodSecurityExpressionHandlerConfiguration;
3332
import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerConfiguration;
3433
import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties;
34+
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
3535
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
3636
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
3737
import org.springframework.boot.context.properties.source.ConfigurationPropertySources;
@@ -127,7 +127,7 @@ public void testDefaultConfiguration() {
127127
this.context.refresh();
128128
this.context.getBean(AUTHORIZATION_SERVER_CONFIG);
129129
this.context.getBean(RESOURCE_SERVER_CONFIG);
130-
this.context.getBean(OAuth2MethodSecurityConfiguration.class);
130+
this.context.getBean(OAuth2MethodSecurityExpressionHandlerConfiguration.class);
131131
ClientDetails config = this.context.getBean(BaseClientDetails.class);
132132
AuthorizationEndpoint endpoint = this.context.getBean(AuthorizationEndpoint.class);
133133
UserApprovalHandler handler = (UserApprovalHandler) ReflectionTestUtils.getField(endpoint,
@@ -308,7 +308,7 @@ public void testDefaultPrePostSecurityAnnotations() {
308308
this.context = new AnnotationConfigServletWebServerApplicationContext();
309309
this.context.register(AuthorizationAndResourceServerConfiguration.class, MinimalSecureWebApplication.class);
310310
this.context.refresh();
311-
this.context.getBean(OAuth2MethodSecurityConfiguration.class);
311+
this.context.getBean(OAuth2MethodSecurityExpressionHandlerConfiguration.class);
312312
ClientDetails config = this.context.getBean(ClientDetails.class);
313313
DelegatingMethodSecurityMetadataSource source = this.context
314314
.getBean(DelegatingMethodSecurityMetadataSource.class);
@@ -324,7 +324,7 @@ public void testClassicSecurityAnnotationOverride() {
324324
this.context = new AnnotationConfigServletWebServerApplicationContext();
325325
this.context.register(SecuredEnabledConfiguration.class, MinimalSecureWebApplication.class);
326326
this.context.refresh();
327-
this.context.getBean(OAuth2MethodSecurityConfiguration.class);
327+
this.context.getBean(OAuth2MethodSecurityExpressionHandlerConfiguration.class);
328328
ClientDetails config = this.context.getBean(ClientDetails.class);
329329
DelegatingMethodSecurityMetadataSource source = this.context
330330
.getBean(DelegatingMethodSecurityMetadataSource.class);
@@ -340,7 +340,7 @@ public void testJsr250SecurityAnnotationOverride() {
340340
this.context = new AnnotationConfigServletWebServerApplicationContext();
341341
this.context.register(Jsr250EnabledConfiguration.class, MinimalSecureWebApplication.class);
342342
this.context.refresh();
343-
this.context.getBean(OAuth2MethodSecurityConfiguration.class);
343+
this.context.getBean(OAuth2MethodSecurityExpressionHandlerConfiguration.class);
344344
ClientDetails config = this.context.getBean(ClientDetails.class);
345345
DelegatingMethodSecurityMetadataSource source = this.context
346346
.getBean(DelegatingMethodSecurityMetadataSource.class);

0 commit comments

Comments
 (0)