我正在使用基于 Spring 的“后端”和 Android“前端”来试验 gRPC,其想法是我将使用 HTTP 上的密码授予类型请求访问令牌(使用标准 /oauth/token RESTful 端点)并使用通过 RPC 的所有后续请求中提供的访问令牌(设置授权标头)。
我的 spring '后端' 上有一个 gRPC 服务器拦截器,它将从服务器调用中获取授权标头并针对令牌存储验证访问令牌。
我不知道下一步该做什么,或者即使到目前为止我所拥有的是“正确”的方法。
这是我的拦截器:
@Component
public class GrpcRequestInterceptor implements ServerInterceptor {
private AuthenticationManager authenticationManager;
public GrpcRequestInterceptor(AuthenticationManager authenticationManager, AuthorizationCodeServices authorizationCodeServices) {
this.authenticationManager = authenticationManager;
}
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> serverCall, Metadata metadata, ServerCallHandler<ReqT, RespT> serverCallHandler) {
String authorizationHeader = metadata.get(Metadata.Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER));
PreAuthenticatedAuthenticationToken preAuthenticatedAuthenticationToken =
new PreAuthenticatedAuthenticationToken(authorizationHeader.substring("Bearer ".length()), "");
PreAuthenticatedAuthenticationProvider preAuthenticatedAuthenticationProvider = new PreAuthenticatedAuthenticationProvider();
preAuthenticatedAuthenticationProvider.setPreAuthenticatedUserDetailsService(new AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken>() {
@Override
public UserDetails loadUserDetails(PreAuthenticatedAuthenticationToken preAuthenticatedAuthenticationToken) throws UsernameNotFoundException {
????
}
});
Authentication authentication = preAuthenticatedAuthenticationProvider.authenticate(preAuthenticatedAuthenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
return serverCallHandler.startCall(serverCall, metadata);
}
}
如何获取令牌服务以及如何仅使用我自己提供的访问令牌针对该服务对我的用户进行身份验证。
我的安全配置如下:
@Configuration
@EnableAuthorizationServer
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AccountDetailsService accountDetailsService;
@Profile(value = "development")
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/h2-console/**");
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(accountDetailsService)
.passwordEncoder(initPasswordEncoder());
}
@Bean
public PasswordEncoder initPasswordEncoder() {
return new BCryptPasswordEncoder(10);
}
}
我应该在这里手动设置令牌服务,然后将其注入我的拦截器还是???完成这项工作的“最灵活”的方法是什么?
任何帮助是极大的赞赏!