外观
权限验证拦截器 🔐
功能介绍 💡
TIP
权限验证拦截器就像一个智能门禁系统,负责管理用户的会话(Session)和权限验证。支持Redis和JWT两种验证方式,可以灵活应对不同的应用场景。
核心功能
- ✅ 会话管理(Redis/JWT)
- ✅ 权限验证
详细配置说明 ⚙️
核心参数说明
参数名 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
enabled | boolean | 否 | false | 是否启用拦截器 |
rules | array | 是 | - | 规则列表 |
权限配置详解 (rules)
基础配置
参数名 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
type | string | 是 | - | 存储类型:redis/jwt |
urls | array | 是 | - | 需要拦截的URL列表 |
authorization-name | string | 否 | authorization | 令牌参数名 |
business-key | string | 否 | bearer | 业务标识(多系统区分用) |
expire | Duration | 否 | - | 过期时间(如:30m) |
is-generate-temp-code | boolean | 否 | false | 是否生成临时码 |
Redis专用配置
参数名 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
redis-auto-expire | boolean | 否 | false | 是否自动延期 |
JWT专用配置
参数名 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
jwt-secret | string | 是 | - | JWT密钥 |
is-crypto | boolean | 否 | false | 是否启用加密 |
encrypt-type | string | 否 | DES3 | 加密算法类型,支持DES3、SM4 |
crypto-key | string | 否 | - | 数据加密密钥(DES3算法要求24位,SM4算法要求16位) |
jwt-check-logout | boolean | 否 | false | 是否验证退出状态 |
权限控制配置
参数名 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
security-enabled-admin-authority | boolean | 否 | false | 是否启用管理员权限 |
security-visitor-urls | array | 否 | - | 游客可访问地址 |
security-login-urls | array | 否 | - | 登录后可访问地址 |
security-forbid-urls | array | 否 | - | 禁止访问地址 |
用户相关配置
参数名 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
user-login-urls | array | 否 | - | 登录接口地址 |
user-logout-urls | array | 否 | - | 退出接口地址 |
user-get-info-urls | array | 否 | - | 获取用户信息接口 |
user-get-session-urls | array | 否 | - | 获取会话信息接口 |
user-login-type | string | 否 | - | 用户登录类型,local 本地用户验证 |
accounts | array | 否 | - | 本地用户配置列表 |
本地用户配置[accounts]
参数名 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
account-id | string | 是 | - | 账户ID |
account-no | string | 是 | - | 账号 |
password | string | 是 | - | 密码 |
nickname | string | 是 | - | 昵称 |
is-admin | boolean | 否 | false | 是否管理员 |
authorize-urls | array | 否 | - | 授权的URL列表 |
authorize-codes | array | 否 | - | 授权的权限码列表 |
配置示例 📋
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
最佳实践 💡
存储方式选择
- Redis:适合需要频繁更新的场景
- JWT:适合分布式系统,无状态管理
安全建议
- 使用HTTPS传输
- 设置合理的过期时间
- 定期更换密钥
性能优化
- 合理设置缓存策略
- 避免频繁的权限检查
- 优化会话存储结构
常见问题 ❓
会话失效
- 检查过期时间设置
- 验证续期配置
- 确认存储服务状态
权限验证失败
- 检查权限配置
- 验证令牌格式
- 确认用户权限列表
安全提示 ⚠️
CAUTION
- 妥善保管JWT密钥和加密密钥
- 定期清理过期会话
- 监控异常登录行为
- 及时更新权限配置