Browse Source

微服务之间调用加上token

yufeng0528 4 years ago
parent
commit
af2105b41c

+ 5 - 5
spring5-admin/pom.xml

@@ -106,11 +106,11 @@
106 106
 			<scope>test</scope>
107 107
 		</dependency>
108 108
 		
109
-<!-- 		<dependency> -->
110
-<!--             <groupId>com.yaozhitech</groupId> -->
111
-<!--             <artifactId>spring5-auth-client</artifactId> -->
112
-<!--             <version>0.1.0</version> -->
113
-<!--         </dependency> -->
109
+		<dependency>
110
+            <groupId>com.yaozhitech</groupId>
111
+            <artifactId>spring5-auth-client</artifactId>
112
+            <version>0.1.0</version>
113
+        </dependency>
114 114
 
115 115
 	</dependencies>
116 116
 </project>

+ 6 - 4
spring5-admin/src/main/java/com/yaozhitech/spring5/config/RoleResourceConfiguration.java

@@ -1,23 +1,25 @@
1 1
 package com.yaozhitech.spring5.config;
2 2
 
3
+import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
4
+import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
3 5
 import org.springframework.context.annotation.Configuration;
4 6
 
5 7
 @Configuration
6
-public class RoleResourceConfiguration /*extends ShiroConfiguration*/{
8
+public class RoleResourceConfiguration extends ShiroConfiguration {
7 9
 	
8
-	/*@Override
10
+	@Override
9 11
 	public ShiroFilterChainDefinition shiroFilterChainDefinition() {
10 12
 		
11 13
 		
12 14
 		DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
13 15
 //    chainDefinition.addPathDefinition("/login", "noSessionCreation,anon");  //login不做认证,noSessionCreation的作用是用户在操作session时会抛异常
14 16
 //    chainDefinition.addPathDefinition("/logout", "noSessionCreation,authcToken[permissive]"); //做用户认证,permissive参数的作用是当token无效时也允许请求访问,不会返回鉴权未通过的错误
15
-//    chainDefinition.addPathDefinition("/image/**", "anon"); ,anyRole[admin,manager]
17
+        chainDefinition.addPathDefinition("/**", "anon");
16 18
 //		chainDefinition.addPathDefinition("/**", "noSessionCreation,authcToken"); // 只允许admin或manager角色的用户访问
17 19
 //		chainDefinition.addPathDefinition("/article/list", "noSessionCreation,authc");
18 20
 //		chainDefinition.addPathDefinition("/article/*", "noSessionCreation,authc[permissive]");
19 21
 //		chainDefinition.addPathDefinition("/**", "noSessionCreation,authc"); // 默认进行用户鉴权
20 22
 		
21 23
 		return chainDefinition;
22
-	}*/
24
+	}
23 25
 }

+ 10 - 1
spring5-auth/spring5-auth-client/pom.xml

@@ -34,6 +34,15 @@
34 34
             <artifactId>java-jwt</artifactId>
35 35
             <version>3.2.0</version>
36 36
         </dependency>
37
-		
37
+        
38
+        <!-- feign -->
39
+        <dependency>
40
+            <groupId>org.springframework.cloud</groupId>
41
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
42
+        </dependency>
43
+		<dependency>
44
+            <groupId>io.github.openfeign</groupId>
45
+            <artifactId>feign-okhttp</artifactId>
46
+        </dependency>
38 47
 	</dependencies>
39 48
 </project>

+ 40 - 0
spring5-auth/spring5-auth-client/src/main/java/com/yaozhitech/spring5/config/FeignOkHttpConfig.java

@@ -0,0 +1,40 @@
1
+package com.yaozhitech.spring5.config;
2
+
3
+import java.util.concurrent.TimeUnit;
4
+
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
7
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
8
+import org.springframework.cloud.openfeign.FeignAutoConfiguration;
9
+import org.springframework.context.annotation.Bean;
10
+import org.springframework.context.annotation.Configuration;
11
+
12
+import com.yaozhitech.spring5.intercept.OkHttpTokenInterceptor;
13
+
14
+import feign.Feign;
15
+import okhttp3.ConnectionPool;
16
+
17
+@AutoConfigureBefore(FeignAutoConfiguration.class)
18
+@Configuration
19
+@ConditionalOnClass(Feign.class)
20
+public class FeignOkHttpConfig {
21
+
22
+	@Autowired
23
+	OkHttpTokenInterceptor okHttpLoggingInterceptor;
24
+
25
+	private int feignOkHttpReadTimeout = 60;
26
+	private int feignConnectTimeout = 60;
27
+	private int feignWriteTimeout = 120;
28
+
29
+//	@Bean
30
+//	public okhttp3.OkHttpClient okHttpClient() {
31
+//		return new okhttp3.OkHttpClient.Builder()
32
+//				.readTimeout(feignOkHttpReadTimeout, TimeUnit.SECONDS)
33
+//				.connectTimeout(feignConnectTimeout, TimeUnit.SECONDS)
34
+//				.writeTimeout(feignWriteTimeout, TimeUnit.SECONDS)
35
+//				.connectionPool(new ConnectionPool())
36
+////				.addInterceptor(okHttpLoggingInterceptor)
37
+//				.addInterceptor(interceptor)
38
+//				.build();
39
+//	}
40
+}

+ 24 - 0
spring5-auth/spring5-auth-client/src/main/java/com/yaozhitech/spring5/config/ServiceAuthConfig.java

@@ -0,0 +1,24 @@
1
+package com.yaozhitech.spring5.config;
2
+
3
+import org.springframework.beans.factory.annotation.Value;
4
+
5
+import lombok.Data;
6
+
7
+/**
8
+ * 微服务之间的认证
9
+ * @author EDZ
10
+ *
11
+ */
12
+@Data
13
+public class ServiceAuthConfig {
14
+
15
+	private byte[] pubKeyByte;
16
+    @Value("${auth.client.id:null}")
17
+    private String clientId;
18
+    @Value("${auth.client.secret}")
19
+    private String clientSecret;
20
+    @Value("${auth.client.token-header}")
21
+    private String tokenHeader;
22
+    @Value("${spring.application.name}")
23
+    private String applicationName;
24
+}

+ 8 - 6
spring5-auth/spring5-auth-client/src/main/java/com/yaozhitech/spring5/config/ShiroConfiguration.java

@@ -17,18 +17,20 @@ import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
17 17
 import org.apache.shiro.web.mgt.DefaultWebSessionStorageEvaluator;
18 18
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
19 19
 import org.springframework.context.annotation.Bean;
20
+import org.springframework.context.annotation.Configuration;
20 21
 
21 22
 import com.yaozhitech.spring5.filter.AnyRolesAuthorizationFilter;
22 23
 import com.yaozhitech.spring5.filter.JwtAuthFilter;
23 24
 import com.yaozhitech.spring5.jwt.JWTShiroRealm;
24
-import com.yaozhitech.spring5.service.UserService;
25
+import com.yaozhitech.spring5.service.JwtUserService;
25 26
 
27
+@Configuration
26 28
 public abstract class ShiroConfiguration {
27 29
 	/**
28 30
 	 * 注册shiro的Filter,拦截请求
29 31
 	 */
30 32
 	@Bean
31
-    public FilterRegistrationBean<Filter> filterRegistrationBean(SecurityManager securityManager,UserService userService) throws Exception{
33
+    public FilterRegistrationBean<Filter> filterRegistrationBean(SecurityManager securityManager,JwtUserService userService) throws Exception{
32 34
         FilterRegistrationBean<Filter> filterRegistration = new FilterRegistrationBean<Filter>();
33 35
         filterRegistration.setFilter((Filter)shiroFilter(securityManager, userService).getObject());
34 36
         filterRegistration.addInitParameter("targetFilterLifecycle", "true");
@@ -40,7 +42,7 @@ public abstract class ShiroConfiguration {
40 42
     }
41 43
 
42 44
     @Bean
43
-    public Authenticator authenticator(UserService userService) {
45
+    public Authenticator authenticator(JwtUserService userService) {
44 46
         ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();
45 47
         authenticator.setRealms(Arrays.asList(jwtShiroRealm(userService)));
46 48
         authenticator.setAuthenticationStrategy(new FirstSuccessfulStrategy());
@@ -62,7 +64,7 @@ public abstract class ShiroConfiguration {
62 64
           * 用于JWT token认证的realm
63 65
      */
64 66
     @Bean("jwtRealm")
65
-    public Realm jwtShiroRealm(UserService userService) {
67
+    public Realm jwtShiroRealm(JwtUserService userService) {
66 68
         JWTShiroRealm myShiroRealm = new JWTShiroRealm(userService);
67 69
         return myShiroRealm;
68 70
     }
@@ -71,7 +73,7 @@ public abstract class ShiroConfiguration {
71 73
           * 设置过滤器,将自定义的Filter加入
72 74
      */
73 75
     @Bean
74
-    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager, UserService userService) {
76
+    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager, JwtUserService userService) {
75 77
     	ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
76 78
         factoryBean.setSecurityManager(securityManager);
77 79
         Map<String, Filter> filterMap = factoryBean.getFilters();
@@ -86,7 +88,7 @@ public abstract class ShiroConfiguration {
86 88
     public abstract ShiroFilterChainDefinition shiroFilterChainDefinition() ;
87 89
 
88 90
    //注意不要加@Bean注解,不然spring会自动注册成filter
89
-    protected JwtAuthFilter createAuthFilter(UserService userService){
91
+    protected JwtAuthFilter createAuthFilter(JwtUserService userService){
90 92
         return new JwtAuthFilter(userService);
91 93
     }
92 94
 

+ 23 - 0
spring5-auth/spring5-auth-client/src/main/java/com/yaozhitech/spring5/config/WebSecurityConfig.java

@@ -0,0 +1,23 @@
1
+package com.yaozhitech.spring5.config;
2
+
3
+import org.springframework.context.annotation.Bean;
4
+import org.springframework.context.annotation.Configuration;
5
+import org.springframework.web.servlet.HandlerInterceptor;
6
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
7
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
8
+
9
+import com.yaozhitech.spring5.intercept.ServiceAuthRestInterceptor;
10
+
11
+@Configuration
12
+public class WebSecurityConfig implements WebMvcConfigurer{
13
+
14
+	@Bean
15
+    public HandlerInterceptor serviceAuthRestInterceptor() {
16
+        return new ServiceAuthRestInterceptor();
17
+    }
18
+
19
+    @Override
20
+    public void addInterceptors(InterceptorRegistry registry) {
21
+        registry.addInterceptor(serviceAuthRestInterceptor());
22
+    }
23
+}

+ 3 - 3
spring5-auth/spring5-auth-client/src/main/java/com/yaozhitech/spring5/filter/JwtAuthFilter.java

@@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
21 21
 
22 22
 import com.yaozhitech.spring5.dto.UserDto;
23 23
 import com.yaozhitech.spring5.jwt.JWTToken;
24
-import com.yaozhitech.spring5.service.UserService;
24
+import com.yaozhitech.spring5.service.JwtUserService;
25 25
 import com.yaozhitech.spring5.utils.JwtUtils;
26 26
 
27 27
 import lombok.extern.slf4j.Slf4j;
@@ -36,9 +36,9 @@ public class JwtAuthFilter extends AuthenticatingFilter {
36 36
     private String tokenHead;
37 37
 
38 38
     private static final int tokenRefreshInterval = 300;
39
-    private UserService userService;
39
+    private JwtUserService userService;
40 40
 
41
-    public JwtAuthFilter(UserService userService){
41
+    public JwtAuthFilter(JwtUserService userService){
42 42
         this.userService = userService;
43 43
         this.setLoginUrl("/login");
44 44
     }

+ 16 - 0
spring5-auth/spring5-auth-client/src/main/java/com/yaozhitech/spring5/intercept/OkHttpTokenInterceptor.java

@@ -0,0 +1,16 @@
1
+package com.yaozhitech.spring5.intercept;
2
+
3
+import org.springframework.context.annotation.Configuration;
4
+
5
+import feign.RequestInterceptor;
6
+import feign.RequestTemplate;
7
+
8
+@Configuration
9
+public class OkHttpTokenInterceptor implements RequestInterceptor{
10
+
11
+	@Override
12
+	public void apply(RequestTemplate template) {
13
+		template.header("X-Forwarded-For", "origin.host.com");
14
+	}
15
+
16
+}

+ 58 - 0
spring5-auth/spring5-auth-client/src/main/java/com/yaozhitech/spring5/intercept/ServiceAuthRestInterceptor.java

@@ -0,0 +1,58 @@
1
+package com.yaozhitech.spring5.intercept;
2
+
3
+import java.util.List;
4
+
5
+import javax.servlet.http.HttpServletRequest;
6
+import javax.servlet.http.HttpServletResponse;
7
+
8
+import org.slf4j.Logger;
9
+import org.slf4j.LoggerFactory;
10
+import org.springframework.beans.factory.annotation.Autowired;
11
+import org.springframework.web.method.HandlerMethod;
12
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
13
+
14
+import com.yaozhitech.spring5.config.ServiceAuthConfig;
15
+
16
+/**
17
+ * 微服务之间的认证
18
+ * @author EDZ
19
+ *
20
+ */
21
+public class ServiceAuthRestInterceptor extends HandlerInterceptorAdapter {
22
+    private Logger logger = LoggerFactory.getLogger(ServiceAuthRestInterceptor.class);
23
+
24
+//  @Autowired
25
+//  private ServiceAuthUtil serviceAuthUtil;
26
+//
27
+//  @Autowired
28
+  private ServiceAuthConfig serviceAuthConfig;
29
+
30
+  private List<String> allowedClient;
31
+
32
+  @Override
33
+  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
34
+      HandlerMethod handlerMethod = (HandlerMethod) handler;
35
+//      // 配置该注解,说明不进行服务拦截
36
+//      IgnoreClientToken annotation = handlerMethod.getBeanType().getAnnotation(IgnoreClientToken.class);
37
+//      if (annotation == null) {
38
+//          annotation = handlerMethod.getMethodAnnotation(IgnoreClientToken.class);
39
+//      }
40
+//      if(annotation!=null) {
41
+//          return super.preHandle(request, response, handler);
42
+//      }
43
+
44
+      String token = request.getHeader("X-Forwarded-For");
45
+      logger.info(token);
46
+      
47
+//      IJWTInfo infoFromToken = serviceAuthUtil.getInfoFromToken(token);
48
+//      String uniqueName = infoFromToken.getUniqueName();
49
+//      for(String client:serviceAuthUtil.getAllowedClient()){
50
+//          if(client.equals(uniqueName)){
51
+//              return super.preHandle(request, response, handler);
52
+//          }
53
+//      }
54
+//      throw new ClientForbiddenException("Client is Forbidden!");
55
+      
56
+      return super.preHandle(request, response, handler);
57
+  }
58
+}

+ 3 - 3
spring5-auth/spring5-auth-client/src/main/java/com/yaozhitech/spring5/jwt/JWTShiroRealm.java

@@ -10,7 +10,7 @@ import org.apache.shiro.realm.AuthorizingRealm;
10 10
 import org.apache.shiro.subject.PrincipalCollection;
11 11
 
12 12
 import com.yaozhitech.spring5.dto.UserDto;
13
-import com.yaozhitech.spring5.service.UserService;
13
+import com.yaozhitech.spring5.service.JwtUserService;
14 14
 import com.yaozhitech.spring5.utils.JwtUtils;
15 15
 
16 16
 
@@ -21,9 +21,9 @@ import com.yaozhitech.spring5.utils.JwtUtils;
21 21
 
22 22
 public class JWTShiroRealm extends AuthorizingRealm {
23 23
 
24
-    protected UserService userService;
24
+    protected JwtUserService userService;
25 25
 
26
-    public JWTShiroRealm(UserService userService){
26
+    public JWTShiroRealm(JwtUserService userService){
27 27
         this.userService = userService;
28 28
         this.setCredentialsMatcher(new JWTCredentialsMatcher());
29 29
     }

+ 1 - 1
spring5-auth/spring5-auth-client/src/main/java/com/yaozhitech/spring5/service/UserService.java

@@ -14,7 +14,7 @@ import com.yaozhitech.spring5.dto.UserDto;
14 14
 import com.yaozhitech.spring5.utils.JwtUtils;
15 15
 
16 16
 @Service
17
-public class UserService {
17
+public class JwtUserService {
18 18
 
19 19
 	@Value("${password.salt}")
20 20
 	private String encryptSalt;

+ 1 - 1
spring5-order/src/main/java/com/yaozhitech/spring5/config/RoleResourceConfiguration.java

@@ -15,7 +15,7 @@ public class RoleResourceConfiguration extends ShiroConfiguration{
15 15
 //    chainDefinition.addPathDefinition("/login", "noSessionCreation,anon");  //login不做认证,noSessionCreation的作用是用户在操作session时会抛异常
16 16
 //    chainDefinition.addPathDefinition("/logout", "noSessionCreation,authcToken[permissive]"); //做用户认证,permissive参数的作用是当token无效时也允许请求访问,不会返回鉴权未通过的错误
17 17
 //    chainDefinition.addPathDefinition("/image/**", "anon"); ,anyRole[admin,manager]
18
-		chainDefinition.addPathDefinition("/**", "noSessionCreation,authcToken"); // 只允许admin或manager角色的用户访问
18
+		chainDefinition.addPathDefinition("/**", "anon"); // 只允许admin或manager角色的用户访问
19 19
 //		chainDefinition.addPathDefinition("/article/list", "noSessionCreation,authc");
20 20
 //		chainDefinition.addPathDefinition("/article/*", "noSessionCreation,authc[permissive]");
21 21
 //		chainDefinition.addPathDefinition("/**", "noSessionCreation,authc"); // 默认进行用户鉴权