spring cloud 调用feign 如何让spring security 拦截器拦截除了通过FeignClientInterceptor接口拦截器中添加Spring Security的认证信息外...
时间: 2023-07-04 14:07:27 浏览: 93
如果您想让Spring Security拦截除`FeignClientInterceptor`接口拦截器中添加Spring Security认证信息以外的Feign调用,可以考虑使用`RequestInterceptor`接口实现类来实现这个需求。`RequestInterceptor`是Feign提供的一个请求拦截器,它可以在每次Feign请求发送前做一些处理,例如添加Header、添加参数等等。
具体实现步骤如下:
1. 创建一个`RequestInterceptor`接口的实现类,例如`FeignAuthInterceptor`。
2. 在`FeignAuthInterceptor`中注入`AuthenticationManager`和`JwtTokenUtil`,用于获取Token和进行Token校验。
3. 在`FeignAuthInterceptor`的`apply`方法中,获取当前请求的URL,并根据URL判断是否需要进行Spring Security认证。
4. 如果需要进行Spring Security认证,则在`FeignAuthInterceptor`中调用`JwtTokenUtil`获取Token,并在请求Header中添加Token信息。
5. 在Feign客户端中,通过`@RequestLine`注解或者`@RequestMapping`注解的`value`属性指定请求URL,然后在Feign客户端的`configuration`属性中指定`FeignAuthInterceptor`。
下面是一个简单的示例:
```java
@Component
public class FeignAuthInterceptor implements RequestInterceptor {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Override
public void apply(RequestTemplate requestTemplate) {
String requestUrl = requestTemplate.url();
// 判断是否需要进行Spring Security认证
if (needAuth(requestUrl)) {
// 获取Token并添加到请求Header中
String token = getToken();
requestTemplate.header("Authorization", "Bearer " + token);
}
}
private boolean needAuth(String requestUrl) {
// 根据请求URL判断是否需要进行Spring Security认证
// ...
}
private String getToken() {
// 获取Token
// ...
}
}
```
在Feign客户端中配置`FeignAuthInterceptor`:
```java
@FeignClient(name = "my-service", configuration = FeignConfig.class)
public interface MyFeignClient {
@RequestMapping(value = "/api/xxx", method = RequestMethod.GET)
String xxx();
}
@Configuration
public class FeignConfig {
@Autowired
private FeignAuthInterceptor feignAuthInterceptor;
@Bean
public RequestInterceptor requestInterceptor() {
return feignAuthInterceptor;
}
}
```
这样,当Feign客户端调用`/api/xxx`接口时,`FeignAuthInterceptor`会拦截请求并添加Token信息到请求Header中,从而实现了Spring Security的拦截。
阅读全文