SpringCloud Gateway鉴权和跨域解决方案

 更新时间:2023年11月24日 10:01:40   作者:Doker 多克  
网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层,也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 网关来做,这样既提高业务灵活性又不缺安全性,本文给大家介绍SpringCloud Gateway鉴权和跨域解决方案,一起看看吧

一、Gateway鉴权实现方案

网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 网关来做,这样既提高业务灵活性又不缺安全性。

RBAC(Role-Based Access Control)基于角色访问控制,目前使用最为广泛的权限模型。相信大家对这种权限模型已经比较了解了。此模型有三个用户、角色和权限,在传统的权限模型用户直接关联加了角色,解耦了用户和权限,使得权限系统有了更清晰的职责划分和更高的灵活度

1、添加依赖

 
<dependency>
  <groupId>io.jsonwebtoken</groupId>
   <artifactId>jjwt</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2、实现代码

 
@Configuration
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
    @Autowired
    JwtTokenUtil jwtTokenUtil;
    @Autowired(required = false)
    JedisUtil jedisUtil;
    private String cachePrefix = "km-gateway-";
    @Value("${spring.redis.expired}")
    private Integer expiredSecond;//600000,10m
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        HttpHeaders httpHeaders = request.getHeaders();
        exchange.getRequest().getURI();
        String requestUri = request.getPath().pathWithinApplication().value();
        String token = null;
        if (httpHeaders != null && httpHeaders.containsKey("token") && !httpHeaders.get("token").isEmpty()) {
            token = httpHeaders.get("token").get(0);
        }
//        AuthenticateRequest
        if (StringUtil.isBlank(token)) {
//            String message = "You current request uri do not have permission or auth.";
//            return getVoidMono(exchange, message);
            return chain.filter(exchange);
        }
        String userAccountId = jwtTokenUtil.getUserAccountIdFromToken(token);
        boolean hasPermission = checkPermission(userAccountId, requestUri);
        String username = jwtTokenUtil.getUsernameFromToken(token);
        String redisSetUrlKey = cachePrefix.concat("url-").concat(username);
        //  log.info("###### hasPermission.2=" + hasPermission);
        if (hasPermission) {
            jedisUtil.SetAndTime(redisSetUrlKey, expiredSecond, requestUri);
        } else {
            String message = "You current request uri do not have permission or auth.";
            // log.warn(message);
            return getVoidMono(exchange, message);
        }
        jwtTokenUtil.isValid(token);
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 0;
    }
   //根据角色权限进行权限控制
    private boolean checkPermission(String userId, String requestUrl) {
        return false;
    }
    private Mono<Void> getVoidMono(ServerWebExchange exchange, String body) {
        exchange.getResponse().setStatusCode(HttpStatus.OK);
        byte[] bytes = body.getBytes(StandardCharsets.UTF_8);
        DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
        return exchange.getResponse().writeWith(Flux.just(buffer));
    }
}

二、Gateway跨域解决方案

在SpringCloud项目中,前后端分离目前很常见,在调试时会遇到前端页面通过不同域名或IP访问微服务的后台,此时,如果不加任何配置,前端页面的请求会被浏览器跨域限制拦截,所以,业务服务常常会添加跨域配置

1、配置类实现

 
@Configuration
public class GulimallCorsConfiguration {
    /**
     * 添加跨域过滤器
     * @return
     */
    @Bean
    public CorsWebFilter corsWebFilter(){
        //基于url跨域,选择reactive包下的
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 跨域配置信息
        CorsConfiguration configuration = new CorsConfiguration();
        // 允许跨域的头
        configuration.addAllowedHeader("*");
        // 允许跨域的请求方式
        configuration.addAllowedMethod("*");
        // 允许跨域的请求来源
        configuration.addAllowedOrigin("*");
        // 是否允许携带cookie跨域
        configuration.setAllowCredentials(true);
        // 任意url都要进行跨域配置
        source.registerCorsConfiguration("/**", configuration);
        return new CorsWebFilter(source);
    }
}
注: SpringCloudGateWay中跨域配置不起作用,原因是SpringCloudGetway是 Springwebflux的而不是SpringWebMvc的,所以我们需要导入的包导入错了

2、配置文件配置

 
server:
  port: 10010
spring:
  application:
    name: gatewayservice
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "https://www.xx.com" # 允许那些网站跨域访问
            allowedMethods: "GET" # 允许那些Ajax方式的跨域请求
            allowedHeaders: "*" # 允许请求头携带信息
            allowCredentials: "*" # 允许携带cookie
            maxAge: 360000 # 这次跨域有效期于相同的跨域请求不会再预检

到此这篇关于SpringCloud Gateway鉴权和跨域解决方案的文章就介绍到这了,更多相关SpringCloud Gateway鉴权和跨域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 中设计模式之单例

    java 中设计模式之单例

    这篇文章主要介绍了java 中设计模式之单例的相关资料,这里说明恶汉模式与懒汉模式,需要的朋友可以参考下
    2017-08-08
  • IDEA创建Servlet程序的两种实现方法

    IDEA创建Servlet程序的两种实现方法

    Servlet是JavaWeb应用程序中不可或缺的组件之一,本文主要介绍了IDEA创建Servlet程序的两种实现方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Springboot内嵌SQLite配置使用详解

    Springboot内嵌SQLite配置使用详解

    这篇文章主要介绍了Springboot内嵌SQLite配置使用详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • maven-shade使用解决项目版本冲突

    maven-shade使用解决项目版本冲突

    在Maven项目中,第三方组件依赖可能与项目已有组件版本冲突,直接使用可能会导致项目运行失败,可以使用maven-shade-plugin插件,本文就来介绍一下maven-shade版本冲突,感兴趣的可以了解一下
    2024-10-10
  • 在SpringMVC框架下实现文件的上传和下载示例

    在SpringMVC框架下实现文件的上传和下载示例

    本篇文章主要介绍了在SpringMVC框架下实现文件的上传和下载示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • maven多模块打包注意事项详解

    maven多模块打包注意事项详解

    这篇文章主要为大家介绍了maven多模块打包注意事项详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java中 ==、equals() 、equalsIgnoreCase() 和compareTo() 方法区别对比详解

    Java中 ==、equals() 、equalsIgnoreCase() 和compar

    本文给大家介绍Java中 ==、equals() 、equalsIgnoreCase() 和compareTo() 方法区别对比详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-09-09
  • 详解Spring学习之编程式事务管理

    详解Spring学习之编程式事务管理

    本篇文章主要介绍了详解Spring学习之编程式事务管理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Spring Boot 配置 Quartz 定时任务的方法

    Spring Boot 配置 Quartz 定时任务的方法

    这篇文章主要介绍了Spring Boot 配置 Quartz 定时任务的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • SpringBoot jar包大小优化问题及解决

    SpringBoot jar包大小优化问题及解决

    这篇文章主要介绍了SpringBoot jar包大小优化问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论