spring cloud 调用feign 如何让spring security 拦截器拦截除了通过FeignClientInterceptor接口拦截器中添加Spring Security的认证信息外...
时间: 2023-07-04 11:28:01 浏览: 183
在SpringCloud 使用Security+Oauth2 时候再去使用fegin,发现出现401未授权
4星 · 用户满意度95%
除了在FeignClientInterceptor接口拦截器中添加Spring Security的认证信息外,还可以通过配置Feign的RequestInterceptor来添加Spring Security的认证信息。
具体实现步骤如下:
1. 创建一个实现了Feign的RequestInterceptor接口的拦截器类,例如:
```java
public class FeignClientSecurityInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.getPrincipal() != null) {
template.header("Authorization", "Bearer " + authentication.getPrincipal());
}
}
}
```
此处的拦截器会从Spring Security的上下文中获取认证信息,并将其添加到Feign请求的Header中。
2. 在FeignClient中配置该拦截器,例如:
```java
@FeignClient(name = "example-service", configuration = ExampleServiceFeignClient.Configuration.class)
public interface ExampleServiceFeignClient {
@GetMapping("/example")
String getExample();
@Configuration
class Configuration {
@Bean
public FeignClientSecurityInterceptor feignClientSecurityInterceptor() {
return new FeignClientSecurityInterceptor();
}
@Bean
public RequestInterceptor requestInterceptor() {
return new FeignClientSecurityInterceptor();
}
}
}
```
可以看到,这里在FeignClient的Configuration类中添加了一个名为feignClientSecurityInterceptor的Bean,并将其添加到了RequestInterceptor中。
这样,每次调用FeignClient时,都会先使用该拦截器获取Spring Security的认证信息,并将其添加到Feign请求的Header中,从而实现了让Spring Security拦截器拦截Feign调用的目的。
阅读全文