提交 261b74bd 编写于 作者: zlt2000's avatar zlt2000

优化Feign拦截器,增加access_token、username、roles、client等重要参数传递

上级 b5f71b95
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
<security-jwt.version>1.0.9.RELEASE</security-jwt.version> <security-jwt.version>1.0.9.RELEASE</security-jwt.version>
<redisson.version>3.9.1</redisson.version> <redisson.version>3.9.1</redisson.version>
<kaptcha.version>0.0.9</kaptcha.version> <kaptcha.version>0.0.9</kaptcha.version>
<hutool.version>4.3.1</hutool.version> <hutool.version>4.6.1</hutool.version>
<mybatis-plus-boot-starter.version>3.1.2</mybatis-plus-boot-starter.version> <mybatis-plus-boot-starter.version>3.1.2</mybatis-plus-boot-starter.version>
<aliyun-sdk-oss>3.4.2</aliyun-sdk-oss> <aliyun-sdk-oss>3.4.2</aliyun-sdk-oss>
<qiniu-java-sdk>7.2.18</qiniu-java-sdk> <qiniu-java-sdk>7.2.18</qiniu-java-sdk>
......
package com.central; package com.central;
import com.central.common.ribbon.annotation.EnableFeignInterceptor;
import com.central.file.properties.FileServerProperties; import com.central.file.properties.FileServerProperties;
import com.central.file.properties.OssProperties;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
...@@ -13,6 +13,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; ...@@ -13,6 +13,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
*/ */
@EnableDiscoveryClient @EnableDiscoveryClient
@EnableConfigurationProperties(FileServerProperties.class) @EnableConfigurationProperties(FileServerProperties.class)
@EnableFeignInterceptor
@SpringBootApplication @SpringBootApplication
public class FileCenterApp { public class FileCenterApp {
public static void main(String[] args) { public static void main(String[] args) {
......
package com.central; package com.central;
import com.central.common.annotation.EnableLoginArgResolver; import com.central.common.annotation.EnableLoginArgResolver;
import com.central.common.ribbon.annotation.EnableFeignInterceptor;
import com.central.search.annotation.EnableSearchClient; import com.central.search.annotation.EnableSearchClient;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
/** /**
...@@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; ...@@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableDiscoveryClient @EnableDiscoveryClient
@EnableSearchClient @EnableSearchClient
@EnableTransactionManagement @EnableTransactionManagement
@EnableFeignInterceptor
@SpringBootApplication @SpringBootApplication
public class UserCenterApp { public class UserCenterApp {
public static void main(String[] args) { public static void main(String[] args) {
......
...@@ -12,6 +12,13 @@ public interface CommonConstant { ...@@ -12,6 +12,13 @@ public interface CommonConstant {
*/ */
String TOKEN_HEADER = "Authorization"; String TOKEN_HEADER = "Authorization";
/**
* The access token issued by the authorization server. This value is REQUIRED.
*/
String ACCESS_TOKEN = "access_token";
String BEARER_TYPE = "Bearer";
/** /**
* 标签 header key * 标签 header key
*/ */
......
...@@ -29,9 +29,8 @@ ...@@ -29,9 +29,8 @@
<artifactId>httpclient</artifactId> <artifactId>httpclient</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>javax.servlet</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId> <artifactId>javax.servlet-api</artifactId>
<optional>true</optional>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>
package com.central.common.ribbon.config; package com.central.common.ribbon.config;
import cn.hutool.core.util.StrUtil;
import com.central.common.constant.CommonConstant;
import com.central.common.constant.SecurityConstants;
import feign.RequestInterceptor; import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.security.core.Authentication; import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.provider.OAuth2Authentication; import javax.servlet.http.HttpServletRequest;
import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; import java.util.Enumeration;
/** /**
* feign拦截器 * feign拦截器
...@@ -16,21 +19,62 @@ import org.springframework.security.oauth2.provider.authentication.OAuth2Authent ...@@ -16,21 +19,62 @@ import org.springframework.security.oauth2.provider.authentication.OAuth2Authent
public class FeignInterceptorConfig { public class FeignInterceptorConfig {
/** /**
* 使用feign client访问别的微服务时,将access_token放入参数或者header ,Authorization:Bearer xxx * 使用feign client访问别的微服务时,将access_token、username、roles、client等信息放入header传递给下一个服务
* 或者url?access_token=xxx
*/ */
@Bean @Bean
public RequestInterceptor requestInterceptor() { public RequestInterceptor requestInterceptor() {
RequestInterceptor requestInterceptor = template -> { RequestInterceptor requestInterceptor = template -> {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
if (authentication != null) { .getRequestAttributes();
if (authentication instanceof OAuth2Authentication) { HttpServletRequest request = attributes.getRequest();
OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
String access_token = details.getTokenValue(); //传递access_token
template.header("Authorization", OAuth2AccessToken.BEARER_TYPE + " " + access_token); String token = extractHeaderToken(request);
} if (StrUtil.isNotEmpty(token)) {
token = request.getParameter(CommonConstant.ACCESS_TOKEN);
}
if (StrUtil.isNotEmpty(token)) {
template.header(CommonConstant.TOKEN_HEADER, CommonConstant.BEARER_TYPE + " " + token);
}
//传递username
String username = request.getHeader(SecurityConstants.USER_HEADER);
if (StrUtil.isNotEmpty(username)) {
template.header(SecurityConstants.USER_HEADER, username);
}
//传递roles
String roles = request.getHeader(SecurityConstants.ROLE_HEADER);
if (StrUtil.isNotEmpty(roles)) {
template.header(SecurityConstants.ROLE_HEADER, roles);
}
//传递client
String client = request.getHeader(SecurityConstants.CLIENT_HEADER);
if (StrUtil.isNotEmpty(client)) {
template.header(SecurityConstants.CLIENT_HEADER, client);
} }
}; };
return requestInterceptor; return requestInterceptor;
} }
/**
* 解析head中的token
* @param request
*/
private static String extractHeaderToken(HttpServletRequest request) {
Enumeration<String> headers = request.getHeaders(CommonConstant.TOKEN_HEADER);
while (headers.hasMoreElements()) {
String value = headers.nextElement();
if ((value.toLowerCase().startsWith(CommonConstant.BEARER_TYPE.toLowerCase()))) {
String authHeaderValue = value.substring(CommonConstant.BEARER_TYPE.length()).trim();
int commaIndex = authHeaderValue.indexOf(',');
if (commaIndex > 0) {
authHeaderValue = authHeaderValue.substring(0, commaIndex);
}
return authHeaderValue;
}
}
return null;
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册