Skip to content

权限验证拦截器 🔐

功能介绍 💡

TIP

权限验证拦截器就像一个智能门禁系统,负责管理用户的会话(Session)和权限验证。支持Redis和JWT两种验证方式,可以灵活应对不同的应用场景。

核心功能

  • ✅ 会话管理(Redis/JWT)
  • ✅ 权限验证

详细配置说明 ⚙️

核心参数说明

参数名类型必填默认值说明
enabledbooleanfalse是否启用拦截器
rulesarray-规则列表

权限配置详解 (rules)

基础配置

参数名类型必填默认值说明
typestring-存储类型:redis/jwt
urlsarray-需要拦截的URL列表
authorization-namestringauthorization令牌参数名
business-keystringbearer业务标识(多系统区分用)
expireDuration-过期时间(如:30m)
is-generate-temp-codebooleanfalse是否生成临时码

Redis专用配置

参数名类型必填默认值说明
redis-auto-expirebooleanfalse是否自动延期

JWT专用配置

参数名类型必填默认值说明
jwt-secretstring-JWT密钥
is-cryptobooleanfalse是否启用加密
encrypt-typestringDES3加密算法类型,支持DES3、SM4
crypto-keystring-数据加密密钥(DES3算法要求24位,SM4算法要求16位)
jwt-check-logoutbooleanfalse是否验证退出状态

权限控制配置

参数名类型必填默认值说明
security-enabled-admin-authoritybooleanfalse是否启用管理员权限
security-visitor-urlsarray-游客可访问地址
security-login-urlsarray-登录后可访问地址
security-forbid-urlsarray-禁止访问地址

用户相关配置

参数名类型必填默认值说明
user-login-urlsarray-登录接口地址
user-logout-urlsarray-退出接口地址
user-get-info-urlsarray-获取用户信息接口
user-get-session-urlsarray-获取会话信息接口
user-login-typestring-用户登录类型,local 本地用户验证
accountsarray-本地用户配置列表

本地用户配置[accounts]

参数名类型必填默认值说明
account-idstring-账户ID
account-nostring-账号
passwordstring-密码
nicknamestring-昵称
is-adminbooleanfalse是否管理员
authorize-urlsarray-授权的URL列表
authorize-codesarray-授权的权限码列表

配置示例 📋

Redis存储配置

yaml
gateway:
  filter:
    session:
      enabled: true
      rules:
      - type: redis  # 使用Redis存储
        urls:  # 拦截的URL
        - /demo/**
        business-key: demo  # 业务标识
        expire: 1h  # 1小时过期
        redis-auto-expire: true  # 自动续期
        user-login-urls:  # 登录接口
        - /demo/login
        user-logout-urls:   # 退出接口
        - /demo/logout
        security-visitor-urls:  # 游客权限
        - /demo/captcha
        - /demo/login
        security-login-urls:  # 登录权限
        - /demo/getInfo

本地用户验证配置

不需要调用微服务接口,直接配置一个用户

yaml
gateway:
  filter:
    session:
      enabled: true
      rules:
      - type: redis  # 使用Redis存储
        urls:  # 拦截的URL
        - /demo/**
        business-key: demo  # 业务标识
        expire: 1h  # 1小时过期
        redis-auto-expire: true  # 自动续期
        user-login-urls:  # 登录接口
        - /demo/login
        user-login-type: local
        accounts:
        - account-no: admin
          account-id: 1
          password: 1234567
          nickname: 管理员11
          is-admin: true
          authorize-urls:
          - /admin/**
          authorize-codes:
          - adddd
        user-logout-urls:   # 退出接口
        - /demo/logout
        security-visitor-urls:  # 游客权限
        - /demo/captcha
        - /demo/login
        security-login-urls:  # 登录权限
        - /demo/getInfo

JWT存储配置

yaml
gateway:
  filter:
    session:
      enabled: true
      rules:
      - type: jwt
        urls: 
        - /demo/**
        jwt-secret: "a748d0d6-1b30-4489-9751-1115134dcb8a"
        is-crypto: true
        crypto-key: "a748d0d6a748d0d6a748d0d6"
        jwt-check-logout: true

登录接口开发 💻

返回对象要求

java
@PostMapping(value = "/login", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<ResultVo<SessionVo>> login(@RequestBody @Valid LoginDto dto) {
    return Mono.just(ResultVo.ok(loginService.login(dto)));
}

登录逻辑示例

java
@Override
public SessionVo login(LoginDto dto) {
    // 1. 验证登录信息
    if (!"admin".equals(dto.getAccountNo()) || !"123456".equals(dto.getPassword())) {
        throw new InvokeException(-1, "用户名或密码不正确");
    }

    // 2. 创建会话信息
    SessionVo session = new SessionVo();
    session.setIsSystem(true);  // 是否管理员
    session.setUserId("1");
    session.setNickname("wueasy");

    // 3. 设置权限信息
    Set<String> authorizeUrls = new HashSet<>();
    authorizeUrls.add("/api/admin/**");
    session.setAuthorizeUrlList(authorizeUrls);

    return session;
}

令牌使用说明 🎫

请求示例

shell
# 使用curl发送请求
curl -X GET \
  -H "authorization: your-token-here" \
  http://127.0.0.1:8080/demo/getInfo

最佳实践 💡

  1. 存储方式选择

    • Redis:适合需要频繁更新的场景
    • JWT:适合分布式系统,无状态管理
  2. 安全建议

    • 使用HTTPS传输
    • 设置合理的过期时间
    • 定期更换密钥
  3. 性能优化

    • 合理设置缓存策略
    • 避免频繁的权限检查
    • 优化会话存储结构

常见问题 ❓

  1. 会话失效

    • 检查过期时间设置
    • 验证续期配置
    • 确认存储服务状态
  2. 权限验证失败

    • 检查权限配置
    • 验证令牌格式
    • 确认用户权限列表

安全提示 ⚠️

CAUTION

  1. 妥善保管JWT密钥和加密密钥
  2. 定期清理过期会话
  3. 监控异常登录行为
  4. 及时更新权限配置

相关文档 📚