首页 > 数据库 >SpringCloud SaToken整合微服务 集成Redis 网关路由权限拦截 服务间内部调用鉴权

SpringCloud SaToken整合微服务 集成Redis 网关路由权限拦截 服务间内部调用鉴权

时间:2024-11-19 16:16:56浏览次数:3  
标签:网关 服务 SaToken SpringCloud Token token user public

介绍

作为 API 网关,通常负责路由、负载均衡、安全控制等功能。进行 统一鉴权 的做法意味着将所有微服务的认证和授权逻辑集中到网关层,而不是每个微服务单独实现。这样做有许多好处,微服务只关心核心业务逻辑,不需要处理身份验证、权限验证等安全问题,减少了开发人员的负担。网关可以统一处理多种认证方式,如 JWT、OAuth 2.0、Basic Auth、API Key 等,灵活配置不同的认证机制。

微服务模块介绍

gateway-service:网关模块 包括:负载均衡 路由拦截 权限校验
user-service :用户模块 包括:用户登录 获取个人信息 等
goods-service:购物车模块 获取商品信息 搜索

全局POM依赖

以下配置需要在全部微服务中进行引入

 <!-- Sa-Token 权限认证(Reactor响应式集成), 在线文档:https://sa-token.cc -->
    <dependency>
        <groupId>cn.dev33</groupId>
        <artifactId>sa-token-reactor-spring-boot-starter</artifactId>
        <version>1.39.0</version>
    </dependency>

    <!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
    <dependency>
        <groupId>cn.dev33</groupId>
        <artifactId>sa-token-redis-jackson</artifactId>
        <version>1.39.0</version>
    </dependency>

 <!-- Sa-Token工具 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>

全局配置文件 集成Redis

以下配置需要在全部微服务中进行引入

spring:
  redis:
    # Redis数据库索引(默认为0)
    database: 1
    # Redis服务器地址
    host: 127.0.0.1
    # Redis服务器连接端口
    port: 6379
    # Redis服务器连接密码(默认为空)
    # password:
    # 连接超时时间
    timeout: 10s
    lettuce:
      pool:
        # 连接池最大连接数
        max-active: 200
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
        # 连接池中的最大空闲连接
        max-idle: 10
        # 连接池中的最小空闲连接
        min-idle: 0
sa-token:
  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
  timeout: 2592000
  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
  active-timeout: 10
  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
  is-concurrent: true
  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
  is-share: true
  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
  token-style: uuid
  # 是否输出操作日志
  is-log: true

网关微服务

配置文件

server:
spring:    
  application:
    name: gateway #服务名称
  cloud:
    nacos:
      server-addr: 172.23.4.128:8848 #注册中心
    gateway:
      routes:
        - id: java-user #路由ID 一般为服务名称
          uri: lb://java-user #转发的路径 lb为负载均衡 java-user为服务接口
          predicates: #路由条件
            - Path=/user/** #请求接口路径
            # - Path=/user/**,/path/**    多个控制器这样写
        - id: java-goods
          uri: lb://java-goods
          predicates:
            - Path=/goods/**

全局过滤器

网关对所有的请求进行拦截

/**
 * [Sa-Token 权限认证] 配置类
 * @author click33
 */
@Configuration
public class SaTokenConfigure {
    // 注册 Sa-Token全局过滤器
    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
                // 拦截地址
                .addInclude("/**")    /* 拦截全部path */
                // 开放地址
                .addExclude("/favicon.ico")
                // 鉴权方法:每次访问进入
                .setAuth(obj -> {
                    // 登录校验 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
                    SaRouter.match("/**", "/user/login", r -> StpUtil.checkLogin());

                })
                // 异常处理方法:每次setAuth函数出现异常时进入
                .setError(e -> {
                    return SaResult.error(e.getMessage());
                    //SaResult.error(e.getMessage())  可以修改成自己的
                })
                ;
    }
}

网关转发鉴权

网关通过权限校验后,会将请求转发到对应的微服务上,这时子微服务也会有相对于的权限校验需要把改用户的token一起转发,这样子微服务的权限校验才会通过。方法还很简单只需要在头发的头部添加SAME_TOKEN参数即可

/**
 * 全局过滤器,为请求添加 Same-Token
 */
@Component
public class ForwardAuthFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest newRequest = exchange
                .getRequest()
                .mutate()
                // 为请求追加 Same-Token 参数
                .header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken())
                .build();
        ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
        return chain.filter(newExchange);
    }
}

用户微服务

spring:
  application:
    name: java-user #服务名称

登录接口

@RestController
@AllArgsConstructor
@RequestMapping("/user")
public class UserController {

    private  final  IUserService userService;

    @PostMapping("/login")
    public SaResult   login(@RequestBody User retUser){
        System.out.println("用户登录");
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getPhone, retUser.getPhone())
                .eq(User::getPassword,retUser.getPassword());
        User user = userService.getOne(queryWrapper);

        if(user==null){
            return SaResult.error("账号或密码错误");
        }
        System.out.println(user);
        
        StpUtil.login(user.getId());
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();

        return SaResult.ok(tokenInfo.getTokenValue());

    }
}

商品微服务

spring:
  application:
    name: java-goods #服务名称

商品权限校验

/**
 * Sa-Token 权限认证 配置类
 */
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    // 注册 Sa-Token 全局过滤器
    @Bean
    public SaServletFilter getSaServletFilter() {
        return new SaServletFilter()
                .addInclude("/**")
                .addExclude("/favicon.ico")
                .setAuth(obj -> {
                    // 校验 Same-Token 身份凭证     —— 以下两句代码可简化为:SaSameUtil.checkCurrentRequestToken();
                    String token = SaHolder.getRequest().getHeader(SaSameUtil.SAME_TOKEN);
                    SaSameUtil.checkToken(token);
                })
                .setError(e -> {
                    return "无访问权限";
                })
                ;
    }
}

如果通过网关转发,可以正常访问。如果直接访问子服务会提示:无效Same-Token:xxx

服务间内部调用鉴权

在微服务架构中,服务间调用鉴权是确保服务之间安全通信的一种机制,防止未经授权的访问。每当一个微服务调用另一个微服务时,都需要验证调用者的身份和权限。常见的服务间鉴权方式包括基于令牌的鉴权、API Key、OAuth2、JWT(JSON Web Token)等方式。

创建OpenFeignConfig请求拦截器

/**
 * feign拦截器, 在feign请求发出之前,加入一些操作 
 */
@Component
public class FeignInterceptor implements RequestInterceptor {
    // 为 Feign 的 RCP调用 添加请求头Same-Token 
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken());
        
        // 如果希望被调用方有会话状态,此处就还需要将 satoken 添加到请求头中
        // requestTemplate.header(StpUtil.getTokenName(), StpUtil.getTokenValue());
    }
}

OpenFeignConfig请求接口

被调用方的代码无需更改,保持启动测试即可

@FeignClient(
        name = "java-goods",                 // 服务名称
        configuration = FeignInterceptor.class      // 请求拦截器 (关键代码)
)
public interface GoodsClient {

    @GetMapping("/goods/list")
    List<Goods> list();

//    List<Goods> list(@RequestParam("ids") List<Long> ids);
//传承就这样写

}

标签:网关,服务,SaToken,SpringCloud,Token,token,user,public
From: https://blog.csdn.net/dpc5201314/article/details/143886070

相关文章

  • AI智能分析视频分析网关越界检测提升加油站安全管理效率智能AI管理平台方案
    在能源行业,尤其是加油站这样的高风险环境中,安全监控的重要性不言而喻。随着人工智能技术的飞速发展,传统的视频监控系统正逐渐被智能化、自动化的解决方案所取代。本文将介绍一个创新的加油站智能AI管理平台,该平台通过集成最新的AI技术和智能分析算法,为加油站安全管理带来了革命性......
  • 睡岗检测视频分析网关摄像机实时接入分析平台值班室离岗识别监测方案
    在现代安全管理中,值班室的监控和人员管理是保障企业运营安全的关键环节。然而,值班人员的离岗或睡岗现象时有发生,这不仅影响了工作效率,更可能带来严重的安全隐患。本文将探讨如何通过值班室离岗识别监测方案,利用摄像机实时接入分析平台视频分析网关,实现对值班人员行为的实时监控和......
  • 01MybatisPlus(SpringCloud入门必学!!!!微服务!!项目实战!!深度理解MP用法!!!)
    微服务springCloud,今天第一课就是MybatisPlus!!!大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。        因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的......
  • AI智能分析视频分析网关周界入侵识别AI算法检测方案
    在当今这个信息化、智能化快速发展的时代,视频监控和人工智能技术的结合正在重塑我们对安全管理的认知。特别是在周界入侵检测等关键领域,AI视频智能分析技术的应用正带来一场效率和准确性的革命。在视频监控及AI视频智能分析领域,我们积累了丰富的技术经验和实践案例。周界入侵视频......
  • 摄像机实时接入分析平台视频分析网关烟火检测算法在街道安防场景中的应用
    传统的火灾防控方式,如安装烟雾报警器和消防器材,虽然在一定程度上能够减少火灾的发生和损失,但仍然存在诸多不足。相比之下,视频监控与智能分析技术的应用,为商铺火灾等安全管理带来了革命性的变革。通过摄像机实时接入分析平台视频分析网关的视频智能分析技术,可以对监控视频进行智能......
  • 面试官:说一下API网关的作用?企业如何应用API网关?
    一、API网关的用处API网关我的分析中会用到以下三种场景。1、OpenAPI企业需要将自身数据、能力等作为开发平台向外开放,通常会以rest的方式向外提供。最好的例子就是淘宝开放平台、腾讯公司的QQ开发平台、微信开放平台。OpenAPI开放平台必然涉及到客户应用的接入、API权限......
  • Profinet转EtherNet/IP协议网关功能及配置
    在现代工业自动化领域,Profinet转EtherNet/IP的互联互通至关重要,远创智控YC-PN-EIP设备是优秀的解决方案。它拥有高效协议转换能力,带来便捷体验,提升企业生产效率与智能化水平。主要功能包括精准的数据转换和传输。突出特点与优势有性能稳定可靠、操作简易。技术参数涵盖传输速率......
  • Profinet转CC-Link IEFB主站协议网关功能及配置
    在现代工业自动化领域,Profinet转CC-LinkIEFB的互联互通至关重要,远创智控YC-CCLKIEM-PN设备是优秀的解决方案。它拥有高效协议转换能力,带来便捷体验,提升企业生产效率与智能化水平。主要功能包括精准的数据转换和传输。突出特点与优势有性能稳定可靠、操作简易。技术参数涵盖传......
  • Profinet转CC-Link IE协议网关功能及配置
    在现代工业自动化领域,Profinet转CC-LinkIE的互联互通至关重要,远创智控YC-PN-CCLKIE设备是优秀的解决方案。它拥有高效协议转换能力,带来便捷体验,提升企业生产效率与智能化水平。主要功能包括精准的数据转换和传输。突出特点与优势有性能稳定可靠、操作简易。技术参数涵盖传输速......
  • 生产环境中AI调用的优化:AI网关高价值应用实践
    随着越来越多的组织将生成式AI引入生产环境,他们面临的挑战已经超出了初步实施的范畴。如果管理不当,扩展性限制、安全漏洞和性能瓶颈可能会阻碍AI应用的推广。实际问题如用户数据的安全性、固定容量限制、成本管理和延迟优化等,需要创新的解决方案。本文我们深入探讨了一些独特的应......