主题
权限验证拦截器
TIP
处理sessoin会话管理(支持redis和jwt方式验证)和权限验证
配置
参数说明
enabled
:是否启用拦截器,默认不启用false
items
:配置项,可以配置多个,需要多个权限系统控制可以配置多个。type
:存储类型,redis
或jwt
urls
:需要拦截的地址,可以配置多个authorization-name
:自定义authorization名称,默认authorization
business-key
:业务key,当需要区分业务时,需要配置,通过业务key进行session隔离(一般在多系统共用网关时需要),需要和登录的业务key一致,默认bearer
redis-auto-expire
:redis自动延期,默认true
expire
:过期时间,可以配置秒,分钟,小时,天,例如:PT30M
30分钟,PT2H
2小时,参考说明login-restriction-type
^1.3.0:登录限制类型,默认NO
;NO
无限制,FORCED
强制登录,REFUSE
拒绝登录is-generate-temp-code
:是否生成临时code,默认false
jwt-secret
:jwt秘钥,jwt类型是必须is-crypto
:是否启动加密,jwt类型有效,默认false
crypto-key
:jwt数据加密key,启用加密后有效jwt-check-logout
^1.3.0:jwt验证退出,启用后,jwt退出后就强制不能继续使用- 用户相关配置
user-login-urls
:登录拦截url,可以配置多个。(需要和微服务接口一致,直接调用微服务接口,调用成功后会自动保存到session中)user-logout-urls
:退出拦截url,可以配置多个user-update-urls
:更新拦截url,可以配置多个user-get-info-urls
:获取用户基础信息拦截url,可以配置多个。包含字段(nickname
昵称、avatarUrl
头像地址、authorizeCodeList
权限代码集合、extendedMap
拓展信息)user-get-session-urls
:获取用户session拦截url,可以配置多个- 权限相关配置
security-enabled-admin-authority
:是否启用管理员权限,启用后,管理员有所有的权限,默认false
。security-visitor-urls
:游客访问权限的url地址,可以配置多个security-login-urls
:登录访问权限的url地址,可以配置多个security-forbid-urls
:禁止访问的url地址,可以配置多个(配置后,当前地址将不能被请求,返回404错误,解决部分接口不能暴露外部访问场景)
示例
WARNING
每一项配置中urls
作为全局拦截配置,只有匹配到了urls
才会执行此配置中其他拦截。
yaml
wueasy :
gateway:
filter:
session:
enabled: true #启用拦截器
items: #可以配置多个列表,需要多个权限系统控制可以配置多个。
- type: redis #指定session存储类型
redis-auto-expire: true #指定session是redis存储的时候,是否自动续期,每次请求后都会续期
expire: PT1H #指定过期时间1小时
urls: #拦截的地址
- /demo/** #拦截/demo/开头的所有url
business-key: demo #业务key,令牌token会以demo开头
user-login-urls: /demo/login #登录接口,需要和微服务接口一致,直接调用微服务接口,调用成功后会自动保存到session中
user-logout-urls: /demo/logout #退出接口
user-get-info-urls: /demo/getInfo #获取用户信息
security-visitor-urls: #游客权限地址,未登录情况下允许的接口
- /demo/captcha
- /demo/login
- /demo/logout
security-login-urls: #登录权限地址,只有登录后可以调用的接口
- /demo/getInfo
登录接口
WARNING
登录接口,必须返回对象ResultVo<SessionVo>
,登录接口中不需要保存session信息,网关会自动处理。
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) {
if (!"admin".equals(dto.getAccountNo()) || !"123456".equals(dto.getPassword())) {
throw new InvokeException(-1, "用户名或密码不正确");
}
// 登录,创建一个session,并返回用户信息,权限信息
SessionVo session = new SessionVo();
session.setIsSystem(true);// 是否超级管理员(1.是)
session.setUserId("1");
session.setNickname("wueasy");
// 可访问的url地址权限,用户有权限的url地址集合
Set<String> linkUrlSetAll = new HashSet<String>();
session.setAuthorizeUrlList(linkUrlSetAll);
return session;
}
令牌说明
WARNING
令牌传输需要通过请求头header
传入,参数名可以通过authorization-name
定义,默认参数名称为authorization
shell
curl -X GET -H "authorization: 令牌值" http://127.0.0.1:8080/demo/getInfo