diff --git a/api/pom.xml b/api/pom.xml index 76f6608d..5dbf5192 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -61,6 +61,25 @@ + + + io.jsonwebtoken + jjwt-api + 0.12.3 + + + io.jsonwebtoken + jjwt-impl + 0.12.3 + runtime + + + + io.jsonwebtoken + jjwt-jackson + 0.12.3 + runtime + diff --git a/api/src/main/java/com/qihang/api/Api.java b/api/src/main/java/com/qihang/api/Api.java index eae9f356..b4140b43 100644 --- a/api/src/main/java/com/qihang/api/Api.java +++ b/api/src/main/java/com/qihang/api/Api.java @@ -3,6 +3,7 @@ package com.qihang.api; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.context.annotation.Bean; /** * Hello world! @@ -17,4 +18,9 @@ public class Api System.out.println( "Hello World! Api" ); SpringApplication.run(Api.class, args); } + +// @Bean +// public TokenFilter tokenFilter() { +// return new TokenFilter(); +// } } diff --git a/api/src/main/java/com/qihang/api/TokenFilter.java b/api/src/main/java/com/qihang/api/TokenFilter.java new file mode 100644 index 00000000..38b695b6 --- /dev/null +++ b/api/src/main/java/com/qihang/api/TokenFilter.java @@ -0,0 +1,33 @@ +package com.qihang.api; + +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.http.HttpStatus; +import org.springframework.util.StringUtils; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +@Configuration +public class TokenFilter implements GlobalFilter, Ordered { + private static final String TOKEN_HEADER = "Authorization"; + private static final String TOKEN_PREFIX = "Bearer "; + private static final String SECRET_KEY = "mysecretkey235200303325adjjeddd"; + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + String token = exchange.getRequest().getHeaders().getFirst(TOKEN_HEADER); + System.out.println("Token:"+token); + // TODO: 统一鉴权处理 + if(!StringUtils.hasText(token)){ + exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); + return exchange.getResponse().setComplete(); + } + return chain.filter(exchange); + } + + @Override + public int getOrder() { + return -10000; + } +} diff --git a/api/src/main/resources/application.yaml b/api/src/main/resources/application.yaml index f6aa5da1..174bca79 100644 --- a/api/src/main/resources/application.yaml +++ b/api/src/main/resources/application.yaml @@ -1,13 +1,12 @@ server: port: 8080 - spring: application: name: api-service - security: - user: - name: admin - password: password +# security: +# user: +# name: admin +# password: password basic: enabled: true cloud: @@ -22,11 +21,20 @@ spring: enabled: true routes: - id: tao_oms_route - uri: lb://tao-oms # lb 表示从 nacos 中按照名称获取微服务,并遵循负载均衡策略,user-service 对应用户微服务应用名 + uri: lb://tao-oms predicates: - - Path=/tao-service/** # 使用断言 + - Path=/api/tao-service/** filters: - - StripPrefix=1 # 使用过滤器 + - StripPrefix=2 + - id: oms_api_route + uri: lb://oms-api + predicates: + - Path=/api/oms-api/** + filters: + - StripPrefix=2 +# - TokenFilter +# default-filters: +# - TokenFilter # - name: Security # 添加安全过滤器 # args: # springSecurityFilterChain: # 配置Spring Security过滤器链 diff --git a/oms-api/pom.xml b/oms-api/pom.xml index af9d1fc7..06031083 100644 --- a/oms-api/pom.xml +++ b/oms-api/pom.xml @@ -26,6 +26,7 @@ UTF-8 3.0.2 2022.0.0.0 + 0.11.5 @@ -116,9 +117,23 @@ io.jsonwebtoken - jjwt - 0.9.1 + jjwt-api + ${jwt.version} + + io.jsonwebtoken + jjwt-impl + ${jwt.version} + runtime + + + + io.jsonwebtoken + jjwt-jackson + ${jwt.version} + runtime + + eu.bitwalker diff --git a/oms-api/src/main/java/com/qihang/oms/api/Api.java b/oms-api/src/main/java/com/qihang/oms/api/OmsApi.java similarity index 83% rename from oms-api/src/main/java/com/qihang/oms/api/Api.java rename to oms-api/src/main/java/com/qihang/oms/api/OmsApi.java index d0f97041..79c8d809 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/Api.java +++ b/oms-api/src/main/java/com/qihang/oms/api/OmsApi.java @@ -2,13 +2,11 @@ package com.qihang.oms.api; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.ComponentScans; import org.springframework.web.client.RestTemplate; /** @@ -19,12 +17,12 @@ import org.springframework.web.client.RestTemplate; @EnableDiscoveryClient @ComponentScan(basePackages={"com.qihang"}) @SpringBootApplication -public class Api +public class OmsApi { public static void main( String[] args ) { System.out.println( "Hello World!" ); - SpringApplication.run(Api.class, args); + SpringApplication.run(OmsApi.class, args); } @Bean diff --git a/oms-api/src/main/java/com/qihang/oms/api/security/JwtAuthenticationTokenFilter.java b/oms-api/src/main/java/com/qihang/oms/api/security/JwtAuthenticationTokenFilter.java index adfba54b..72ea0215 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/security/JwtAuthenticationTokenFilter.java +++ b/oms-api/src/main/java/com/qihang/oms/api/security/JwtAuthenticationTokenFilter.java @@ -41,9 +41,16 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { - String token = request.getHeader(TOKEN_HEADER); +// String token = exchange.getRequest().getHeaders().getFirst(TOKEN_HEADER); + String token = request.getHeader("Authorization"); + log.info("intercept " + request.getRequestURI()); log.info("token: " + token); + if(request.getRequestURI().equals("/login")){ + // 登录页面,放行 + chain.doFilter(request, response); + return; + } LoginUser loginUser = tokenService.getLoginUser(request); if (loginUser !=null ) { @@ -51,6 +58,9 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authenticationToken); + }else { + fallback(" 授权过期!",response); + return; } chain.doFilter(request, response); } diff --git a/oms-core/pom.xml b/oms-core/pom.xml index d289426a..466ed1fc 100644 --- a/oms-core/pom.xml +++ b/oms-core/pom.xml @@ -19,7 +19,8 @@ UTF-8 UTF-8 3.0.2 - 0.9.1 + 0.11.5 + 2022.0.0.0 @@ -46,20 +47,19 @@ spring-tx 6.0.4 - - org.springframework.boot - spring-boot-starter-security - org.springframework.boot spring-boot-starter-data-redis - - - - - - + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + jakarta.servlet @@ -68,8 +68,22 @@ provided + + com.alibaba + druid-spring-boot-starter + 1.2.21 + + + mysql + mysql-connector-java + 8.0.33 + - + + com.baomidou + mybatis-plus-boot-starter + 3.5.5 + junit junit @@ -91,9 +105,23 @@ io.jsonwebtoken - jjwt + jjwt-api ${jwt.version} + + io.jsonwebtoken + jjwt-impl + ${jwt.version} + runtime + + + + io.jsonwebtoken + jjwt-jackson + ${jwt.version} + runtime + + com.alibaba.fastjson2 fastjson2 @@ -113,14 +141,21 @@ - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring-cloud-alibaba.version} + pom + import + + diff --git a/oms-core/src/main/java/com/qihang/core/App.java b/oms-core/src/main/java/com/qihang/core/OmsCoreApplication.java similarity index 58% rename from oms-core/src/main/java/com/qihang/core/App.java rename to oms-core/src/main/java/com/qihang/core/OmsCoreApplication.java index be4d72b0..6501a985 100644 --- a/oms-core/src/main/java/com/qihang/core/App.java +++ b/oms-core/src/main/java/com/qihang/core/OmsCoreApplication.java @@ -3,23 +3,20 @@ package com.qihang.core; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.web.client.RestTemplate; /** * Hello world! * */ @EnableCaching -@ComponentScan(basePackages = "com.qihang") +//@ComponentScan(basePackages = "com.qihang") @SpringBootApplication -public class App +public class OmsCoreApplication { public static void main( String[] args ) { System.out.println( "Hello World!" ); - SpringApplication.run(App.class, args); + SpringApplication.run(OmsCoreApplication.class, args); } } diff --git a/oms-core/src/main/java/com/qihang/core/config/SecurityConfig.java b/oms-core/src/main/java/com/qihang/core/config/SecurityConfig.java index cae5b87a..e845e061 100644 --- a/oms-core/src/main/java/com/qihang/core/config/SecurityConfig.java +++ b/oms-core/src/main/java/com/qihang/core/config/SecurityConfig.java @@ -1,81 +1,49 @@ -//package com.qihang.core.config; -// -//import com.qihang.core.security.AuthenticationEntryPointImpl; -//import com.qihang.core.security.LogoutSuccessHandlerImpl; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.http.HttpMethod; -//import org.springframework.security.config.annotation.SecurityBuilder; -//import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; -//import org.springframework.security.config.annotation.web.WebSecurityConfigurer; -//import org.springframework.security.config.annotation.web.builders.HttpSecurity; -//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -//import org.springframework.security.config.http.SessionCreationPolicy; -//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -//import org.springframework.security.web.SecurityFilterChain; -// -//@Configuration -//@EnableWebSecurity -//@EnableMethodSecurity -//public class SecurityConfig { -// @Value("${auth.whitelist:/login}") -// private String[] URL_WHITELIST; -// -// @Autowired -// private AuthenticationEntryPointImpl unauthorizedHandler; -// @Autowired -// private LogoutSuccessHandlerImpl logoutSuccessHandler; -// @Bean -// public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { -//// http -//// // CSRF禁用,因为不使用session -//// .csrf().disable() -//// .authorizeRequests() -//// .anyRequest().authenticated() -//// .and() -//// .formLogin() -//// .and() -//// .httpBasic(); -// // CSRF禁用,因为不使用session -// http.csrf().disable() -// // 禁用HTTP响应标头 -// .headers().cacheControl().disable().and() -// // 认证失败处理类 -//// .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() -// // 基于token,所以不需要session -// .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() -// // 过滤请求 -// .authorizeRequests() -// .formLogin(form -> form. -// loginProcessingUrl("/login") -// .usernameParameter("username") -// .passwordParameter("password") -// .successHandler(unauthorizedHandler) -//// .failureHandler(unauthorizedHandler)) -// // 对于登录login 注册register 验证码captchaImage 允许匿名访问 -// .antMatchers("/login", "/register", "/captchaImage").permitAll() -// // 静态资源,可匿名访问 -// .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() -// .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() -// .antMatchers("/test/**").permitAll() -// .antMatchers("/preview/**").permitAll() -// .antMatchers("/h2-console/**").permitAll() -// .antMatchers("/taoapi2/**").permitAll() -// // 除上面外的所有请求全部需要鉴权认证 -// .anyRequest().authenticated() -// .and() -// .headers().frameOptions().disable(); -// return http.build(); -// } -// -// /** -// * 强散列哈希加密实现 -// */ -// @Bean -// public BCryptPasswordEncoder bCryptPasswordEncoder() -// { -// return new BCryptPasswordEncoder(); -// } -//} +package com.qihang.core.config; + +import com.qihang.core.security.AuthenticationEntryPointImpl; +import com.qihang.core.security.LogoutSuccessHandlerImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.SecurityBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.WebSecurityConfigurer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +@EnableMethodSecurity +public class SecurityConfig { + @Autowired + private AuthenticationEntryPointImpl unauthorizedHandler; + @Autowired + private LogoutSuccessHandlerImpl logoutSuccessHandler; + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http + .csrf().disable() + .authorizeRequests() + .anyRequest().authenticated() + .and() + .formLogin() + .and() + .httpBasic(); + + return http.build(); + } + + /** + * 强散列哈希加密实现 + */ + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() + { + return new BCryptPasswordEncoder(); + } +} diff --git a/oms-core/src/main/java/com/qihang/core/controller/HomeController.java b/oms-core/src/main/java/com/qihang/core/controller/HomeController.java new file mode 100644 index 00000000..b199c80b --- /dev/null +++ b/oms-core/src/main/java/com/qihang/core/controller/HomeController.java @@ -0,0 +1,13 @@ +package com.qihang.core.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HomeController { + + @GetMapping("/home") + public String home(){ + return "oms-core:home"; + } +} diff --git a/oms-core/src/main/java/com/qihang/core/security/SecurityUser.java b/oms-core/src/main/java/com/qihang/core/security/SecurityUser.java index c0a41510..7511d3f1 100644 --- a/oms-core/src/main/java/com/qihang/core/security/SecurityUser.java +++ b/oms-core/src/main/java/com/qihang/core/security/SecurityUser.java @@ -10,8 +10,8 @@ import java.util.Collection; * TODO * * @Description - * @Author laizhenghua - * @Date 2023/6/29 22:49 + * @Author + * @Date **/ public class SecurityUser implements UserDetails { private SysUser userEntity; diff --git a/oms-core/src/main/java/com/qihang/core/security/TokenService.java b/oms-core/src/main/java/com/qihang/core/security/TokenService.java index c95b0daf..44527764 100644 --- a/oms-core/src/main/java/com/qihang/core/security/TokenService.java +++ b/oms-core/src/main/java/com/qihang/core/security/TokenService.java @@ -30,15 +30,15 @@ import java.util.concurrent.TimeUnit; public class TokenService { // 令牌自定义标识 - @Value("${token.header}") + @Value("${token.header:'Authorization'}") private String header; // 令牌秘钥 - @Value("${token.secret}") + @Value("${token.secret:'mysecretkey235200303325adjjeddd'}") private String secret; // 令牌有效期(默认30分钟) - @Value("${token.expireTime}") + @Value("${token.expireTime:30}") private int expireTime; protected static final long MILLIS_SECOND = 1000; diff --git a/oms-core/src/main/resources/application.properties b/oms-core/src/main/resources/application.properties deleted file mode 100644 index 5193cd68..00000000 --- a/oms-core/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.redis.host=localhost -spring.redis.port=6379 -spring.redis.password= -spring.redis.database=0 \ No newline at end of file diff --git a/oms-core/src/main/resources/application.yaml b/oms-core/src/main/resources/application.yaml new file mode 100644 index 00000000..19fc59cb --- /dev/null +++ b/oms-core/src/main/resources/application.yaml @@ -0,0 +1,14 @@ +spring: + cloud: + nacos: + serverAddr: 127.0.0.1:8848 + discovery: + server-addr: 127.0.0.1:8848 + config: + import: + - nacos:qihang-oms.yaml?refresh=true + application: + name: oms-core + +server: + port: 8083 \ No newline at end of file diff --git a/oms-core/src/test/java/com/qihang/AppTest.java b/oms-core/src/test/java/com/qihang/OmsCoreApplicationTest.java similarity index 77% rename from oms-core/src/test/java/com/qihang/AppTest.java rename to oms-core/src/test/java/com/qihang/OmsCoreApplicationTest.java index 14e13c7a..08b52d8c 100644 --- a/oms-core/src/test/java/com/qihang/AppTest.java +++ b/oms-core/src/test/java/com/qihang/OmsCoreApplicationTest.java @@ -7,7 +7,7 @@ import junit.framework.TestSuite; /** * Unit test for simple App. */ -public class AppTest +public class OmsCoreApplicationTest extends TestCase { /** @@ -15,7 +15,7 @@ public class AppTest * * @param testName name of the test case */ - public AppTest( String testName ) + public OmsCoreApplicationTest(String testName ) { super( testName ); } @@ -25,7 +25,7 @@ public class AppTest */ public static Test suite() { - return new TestSuite( AppTest.class ); + return new TestSuite( OmsCoreApplicationTest.class ); } /** diff --git a/tao-oms/src/main/java/com/qihang/tao/controller/HomeController.java b/tao-oms/src/main/java/com/qihang/tao/controller/HomeController.java index a76e7f5c..be7a5789 100644 --- a/tao-oms/src/main/java/com/qihang/tao/controller/HomeController.java +++ b/tao-oms/src/main/java/com/qihang/tao/controller/HomeController.java @@ -1,5 +1,6 @@ package com.qihang.tao.controller; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; @@ -16,7 +17,9 @@ public class HomeController { private String serverName; @GetMapping(value = "/test/na") - public String get() { + public String get(HttpServletRequest request) { + String token = request.getHeader("Authorization"); + System.out.println("tao-api token:"+token); return serverName; }