Skip to content

Commit 23f5fa1

Browse files
committed
Merge AutoConfig and Edit AuthenticationManagerResolver behavior
1 parent 276ec90 commit 23f5fa1

File tree

6 files changed

+46
-128
lines changed

6 files changed

+46
-128
lines changed

grpc-server-spring-boot-autoconfigure/src/main/java/net/devh/boot/grpc/server/autoconfigure/GrpcServerSecurityAutoConfiguration.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@
2525
import org.springframework.security.access.AccessDecisionManager;
2626
import org.springframework.security.access.AccessDeniedException;
2727
import org.springframework.security.authentication.AuthenticationManager;
28+
import org.springframework.security.authentication.AuthenticationManagerResolver;
2829
import org.springframework.security.core.AuthenticationException;
2930

3031
import net.devh.boot.grpc.server.security.authentication.GrpcAuthenticationReader;
3132
import net.devh.boot.grpc.server.security.check.GrpcSecurityMetadataSource;
32-
import net.devh.boot.grpc.server.security.interceptors.AuthenticatingServerInterceptor;
33-
import net.devh.boot.grpc.server.security.interceptors.AuthorizationCheckingServerInterceptor;
34-
import net.devh.boot.grpc.server.security.interceptors.DefaultAuthenticatingServerInterceptor;
35-
import net.devh.boot.grpc.server.security.interceptors.ExceptionTranslatingServerInterceptor;
33+
import net.devh.boot.grpc.server.security.interceptors.*;
3634

3735
/**
3836
* Auto configuration class with the required beans for the spring-security configuration of the grpc server.
@@ -59,7 +57,7 @@
5957
* @author Daniel Theuke (daniel.theuke@heuboe.de)
6058
*/
6159
@Configuration(proxyBeanMethods = false)
62-
@ConditionalOnBean(AuthenticationManager.class)
60+
@ConditionalOnBean(GrpcAuthenticationReader.class)
6361
@AutoConfigureAfter(SecurityAutoConfiguration.class)
6462
public class GrpcServerSecurityAutoConfiguration {
6563

@@ -83,13 +81,31 @@ public ExceptionTranslatingServerInterceptor exceptionTranslatingServerIntercept
8381
* @return The authenticatingServerInterceptor bean.
8482
*/
8583
@Bean
84+
@ConditionalOnBean(AuthenticationManager.class)
8685
@ConditionalOnMissingBean(AuthenticatingServerInterceptor.class)
8786
public DefaultAuthenticatingServerInterceptor authenticatingServerInterceptor(
8887
final AuthenticationManager authenticationManager,
8988
final GrpcAuthenticationReader authenticationReader) {
9089
return new DefaultAuthenticatingServerInterceptor(authenticationManager, authenticationReader);
9190
}
9291

92+
/**
93+
* The security interceptor that handles the authentication of requests.
94+
*
95+
* @param grpcAuthenticationManagerResolver The authentication manager resolver used to verify the credentials.
96+
* @param authenticationReader The authentication reader used to extract the credentials from the call.
97+
* @return The authenticatingServerInterceptor bean.
98+
*/
99+
@Bean
100+
@ConditionalOnBean(parameterizedContainer = AuthenticationManagerResolver.class, value = GrpcServerRequest.class)
101+
@ConditionalOnMissingBean(AuthenticatingServerInterceptor.class)
102+
public ManagerResolverAuthenticatingServerInterceptor managerResolverAuthenticatingServerInterceptor(
103+
final AuthenticationManagerResolver<GrpcServerRequest> grpcAuthenticationManagerResolver,
104+
final GrpcAuthenticationReader authenticationReader) {
105+
return new ManagerResolverAuthenticatingServerInterceptor(grpcAuthenticationManagerResolver,
106+
authenticationReader);
107+
}
108+
93109
/**
94110
* The security interceptor that handles the authorization of requests.
95111
*

grpc-server-spring-boot-autoconfigure/src/main/java/net/devh/boot/grpc/server/autoconfigure/GrpcServerSecurityWithManagerResolverAutoConfiguration.java

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

grpc-server-spring-boot-autoconfigure/src/main/java/net/devh/boot/grpc/server/security/interceptors/AbstractAuthenticatingServerInterceptor.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,10 @@ public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(final ServerCall<Re
8484
}
8585
log.debug("Credentials found: Authenticating '{}'", authentication.getName());
8686

87-
AuthenticationManager authenticationManager = this.getAuthenticationManager(call, headers);
87+
AuthenticationManager authenticationManager = getAuthenticationManager(call, headers);
8888
if (authenticationManager == null) {
89-
log.debug("No authentication manager found: Continuing unauthenticated");
90-
try {
91-
return next.startCall(call, headers);
92-
} catch (final AccessDeniedException e) {
93-
throw newNoCredentialsException(e);
94-
}
89+
log.debug("No authentication manager found");
90+
throw new InternalAuthenticationServiceException("No authentication manager found");
9591
}
9692

9793
try {

grpc-server-spring-boot-autoconfigure/src/main/java/net/devh/boot/grpc/server/security/interceptors/GrpcServerRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ public GrpcServerRequest(ServerCall<?, ?> call, Metadata headers) {
3939
return call.getMethodDescriptor();
4040
}
4141

42-
}
42+
}

tests/src/test/java/net/devh/boot/grpc/test/config/BaseAutoConfiguration.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@
2424
import net.devh.boot.grpc.server.autoconfigure.GrpcServerAutoConfiguration;
2525
import net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguration;
2626
import net.devh.boot.grpc.server.autoconfigure.GrpcServerSecurityAutoConfiguration;
27-
import net.devh.boot.grpc.server.autoconfigure.GrpcServerSecurityWithManagerResolverAutoConfiguration;
2827

2928
@Configuration
3029
@ImportAutoConfiguration({GrpcCommonCodecAutoConfiguration.class, GrpcServerAutoConfiguration.class,
3130
GrpcServerFactoryAutoConfiguration.class, GrpcServerSecurityAutoConfiguration.class,
32-
GrpcServerSecurityWithManagerResolverAutoConfiguration.class,
3331
GrpcClientAutoConfiguration.class})
3432
public class BaseAutoConfiguration {
3533

tests/src/test/java/net/devh/boot/grpc/test/config/WithBasicAuthAndManagerResolverSecurityConfiguration.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package net.devh.boot.grpc.test.config;
1818

1919
import static net.devh.boot.grpc.client.security.CallCredentialsHelper.basicAuth;
20-
import static net.devh.boot.grpc.common.security.SecurityConstants.AUTHORIZATION_HEADER;
2120

2221
import java.util.ArrayList;
2322
import java.util.Arrays;
@@ -35,6 +34,7 @@
3534
import org.springframework.security.core.userdetails.UsernameNotFoundException;
3635
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
3736
import org.springframework.security.crypto.password.PasswordEncoder;
37+
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
3838

3939
import com.google.common.collect.ImmutableMap;
4040

@@ -75,17 +75,33 @@ DaoAuthenticationProvider daoAuthenticationProvider() {
7575
return provider;
7676
}
7777

78+
InMemoryUserDetailsManager inMemoryUserDetailsManager() {
79+
PasswordEncoder passwordEncoder = passwordEncoder();
80+
InMemoryUserDetailsManager userDetailsService = new InMemoryUserDetailsManager();
81+
userDetailsService.createUser(new User("client1", passwordEncoder.encode("client1"),
82+
List.of(new SimpleGrantedAuthority("ROLE_CLIENT1"))));
83+
userDetailsService.createUser(new User("client2", passwordEncoder.encode("client2"),
84+
List.of(new SimpleGrantedAuthority("ROLE_CLIENT2"))));
85+
return userDetailsService;
86+
}
87+
88+
DaoAuthenticationProvider daoAuthenticationProviderInMemory() {
89+
final DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
90+
provider.setUserDetailsService(inMemoryUserDetailsManager());
91+
provider.setPasswordEncoder(passwordEncoder());
92+
return provider;
93+
}
7894

7995
@Bean
8096
AuthenticationManagerResolver<GrpcServerRequest> authenticationManager() {
8197
return context -> {
82-
String token = context.headers().get(AUTHORIZATION_HEADER);
83-
if (token != null && token.startsWith("Basic")) {
98+
String methodName = context.methodDescriptor().getFullMethodName();
99+
if (methodName.equals("TestService/normal")) {
100+
return daoAuthenticationProviderInMemory()::authenticate;
101+
} else {
84102
final List<AuthenticationProvider> providers = new ArrayList<>();
85103
providers.add(daoAuthenticationProvider());
86104
return new ProviderManager(providers);
87-
} else {
88-
return null;
89105
}
90106
};
91107
}

0 commit comments

Comments
 (0)