我遵循以下建议:https://jhipster.github.io/microservices-architecture/来组织我的微服务应用程序的架构。
我有一个设置,其中有一些微服务可供网关访问。我已经为所有组件(网关,微服务和注册表)提供了相同的秘密(jhipster.security.authentication.jwt.secret)。
但是,当我尝试从网关使用微服务时,通过以下方式,我总是会收到一条拒绝访问的消息(禁止403):
@FeignClient(value = "storageservice")
public interface StorageServiceClient {
@RequestMapping(method = RequestMethod.GET, value = "api/applications")
ResponseEntity<List<ApplicationDTO>> getApplications();
}
我通过这种方式进行测试(在我的网关中):
@RestController
@RequestMapping("/api")
public class StorageServiceTest {
@Inject
private DiscoveryClient discoveryClient;
@Inject
private RestTemplate template;
@Inject
private SecurityConfiguration security;
@Inject
private StorageServiceClient storageServiceClient;
@Inject
private AuthenticationManager authenticationManager;
@RequestMapping(value = "/apps",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<List<ApplicationDTO>> getApplications(){
ResponseEntity<List<ApplicationDTO>> apps = storageServiceClient.getApplications();
Stream.of(apps).forEach(System.out::println);
return apps;
}
}
我感兴趣的是,我已经测试了对微服务的直接访问(通过邮递员)和网关的路由访问,并且运行良好。但是,特别是在这种情况下,当我尝试通过API从网关使用微服务数据时,我收到403错误。
在我的微服务中,我有配置(在MicroServiceConfiguration类&#34; .antMatchers(&#34; / api / **&#34;)。authenticated()&#34;)。但在所有情况下,当我通过Postman进行测试时,我总是传递一个有效的JWT令牌。但只有在这种特殊情况下它才起作用......我甚至试图在我的&#34; StorageServiceClient&#34;中使用@Header注释。但它没有任何效果。
***********编辑***********:
我通过创建类似的RequestInterceptor解决了身份验证问题:
@Configuration
public class FeignConfig {
@Inject
private JHipsterProperties properties;
@Bean
public RequestInterceptor requestTokenBearerInterceptor() {
return requestTemplate -> {
String token = Jwts.builder().
setSubject("admin")
.claim("auth", "admin")
.signWith(SignatureAlgorithm.HS512, properties.getSecurity().getAuthentication().getJwt().getSecret())
.compact();
requestTemplate.header("Authorization", "Bearer " + token);
};
}}