轻量级 Java 权限认证框架Sa-Token初体验(三)
经过前两篇文章的体验,我已经初步接触了Sa-Token的登录、退出、在线状态检测以及前后端分离的实现。这次来体验Sa-Token部分常用配置。
sa-toekn.token-name token名称
首先是前文用到过的token-name,token-name用来指定token的名称,如果不指定,默认的名称是satoken,我们删掉所有配置来测试一下。
这时执行登陆,查看返回内容
可以看到默认的token名称是satoken,我们可以通过修改token-name配置,指定我们需要的token名称
sa-token:
token-name: token
再次登录
sa-toekn.timeout 超时时间
超时时间,默认是三十天,单位是秒,我们来配置个5秒超时,验证一下是否好用
sa-token:
token-name: token
timeout: 5
执行登录,然后查看登陆状态
5秒后再次查询登陆状态
sa-toekn.activity-timeout 临时超时时间
说实话看到这个介绍我还是有点开心的,因为曾经开发过类似的业务,但是还有什么比框架本身就支持来得更舒服呢?把超时时间注释掉,加上把临时有效期设置为5s再测试一波。
先登录,再多次查询登录状态,不出意外的5s以后掉线了[泣不成声],赶快看看文档,文档里写着:在每次直接或间接调用getLoginId()时进行一次过期检查与续签操作。想想也对,毕竟在需要身份认证的接口中每次访问都要获取用户Id的,没毛病,暂且先在检查登录状态接口获取一下ID进行返回,修改代码再测试。
// 查询登录状态,浏览器访问: http://localhost:9999/user/isLogin
@RequestMapping("isLogin")
public String isLogin() {
return "当前会话是否登录:" + StpUtil.isLogin() + (StpUtil.isLogin() ? "登录的Id:"+StpUtil.getLoginId() : "") ;
}
这次就没问题了,在不停地重新请求接口的过程中,没有发生掉线的情况
在5s无操作之后,再次刷新
这时候就正常掉线了,真的很方便。该功能测试完毕,修改成一个常用的超时时间,开始测试其他配置。
sa-toekn.is-concurrent 同账号并发登录(多地登录)
这个配置也是一个常用的配置,有些系统同一个账号同一时间只允许在一个设备上登录,有些系统则没有这样的限制,现在配置里增加:
sa-token:
# 是否允许同一账号并发登录
is-concurrent: true
再利用两个浏览器分别执行登陆,检查登录状态
可以看到两个浏览器都登录成功,并且得到了相同的token值,检查登录状态
也可以获取到相同的登录信息,我们修改配置为false,再次运行
sa-token:
# 是否允许同一账号并发登录
is-concurrent: false
首先分别执行登陆
再分别查看登陆状态
可以确定,首先登录的那个已经被挤下线了
sa-toekn.is-share 同账号并发登录是否共用Token
这个也是一个非常实用的功能,如果希望同账号在不同设备登陆时享有单独的超时时间、设备标签等,就可以不共用token,反之就可以公用token,保证账号一处登出,所有设备同时下线,增加安全性。
更多配置
官方文档提供详尽的配置项表格,有兴趣的可以去查看文档,可以说是非常实用了。
参数名称 | 类型 | 默认值 | 说明 |
tokenName | String | satoken | token名称 (同时也是cookie名称) |
timeout | long | 2592000 | token有效期,单位/秒 默认30天,-1代表永久有效 参考:token有效期详解 |
activityTimeout | long | -1 | token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒, 默认-1 代表不限制 (例如可以设置为1800代表30分钟内无操作就过期) 参考:token有效期详解 |
isConcurrent | Boolean | true | 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) |
isShare | Boolean | true | 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) |
isReadBody | Boolean | true | 是否尝试从 请求体 里读取 Token |
isReadHead | Boolean | true | 是否尝试从 header 里读取 Token |
isReadCookie | Boolean | true | 是否尝试从 cookie 里读取 Token |
tokenStyle | String | uuid | token风格, 参考:自定义Token风格 |
dataRefreshPeriod | int | 30 | 默认dao层实现类中,每次清理过期数据间隔的时间 (单位: 秒) ,默认值30秒,设置为-1代表不启动定时清理 |
tokenSessionCheckLogin | Boolean | true | 获取 Token-Session 时是否必须登录 (如果配置为true,会在每次获取 Token-Session 时校验是否登录) |
autoRenew | Boolean | true | 是否打开自动续签 (如果此值为true, 框架会在每次直接或间接调用 getLoginId() 时进行一次过期检查与续签操作) |
tokenPrefix | String | null | token前缀, 例如填写 Bearer 实际传参 satoken: Bearer xxxx-xxxx-xxxx-xxxx 参考:自定义Token前缀 |
isPrint | Boolean | true | 是否在初始化配置时打印版本字符画 |
isLog | Boolean | false | 是否打印操作日志 |
jwtSecretKey | String | null | jwt秘钥 (只有集成 sa-token-temp-jwt 模块时此参数才会生效) |
idTokenTimeout | long | 86400 | Id-Token的有效期 (单位: 秒) |
basic | String | "" | Http Basic 认证的账号和密码 参考:Http Basic 认证 |
currDomain | String | null | 配置当前项目的网络访问地址 |
checkIdToken | Boolean | false | 是否校验Id-Token(部分rpc插件有效) |
sso | Object | new SaSsoConfig() | SSO 单点登录相关配置 |
cookie | Object | new SaCookieConfig() | Cookie配置对象 |