用go设计开发一个自己的轻量级登录库/框架吧(业务篇)
1|0用go设计开发一个自己的轻量级登录库/框架吧(业务篇)
本篇会讲讲框架的登录业务的实现。实现三种登录模式:
- 同一用户只能登录一次
- 同一用户多次登录多token
- 同一用户多次登录共享一个token
源码:weloe/token-go: a light login library (github.com)
2|0存储结构
首先从我们要考虑是底层该怎么存储登录信息来去达成这三种登录模式
- 同一用户只能登录一次
- 同一用户多次登录多token
- 同一用户多次登录共享一个token
我们不能使用无状态token模式,要有状态,在后端存储会话信息才能达成想要实现的一些逻辑,因此,存储会话信息是必要的。
对于每个请求,我们会存储一个token-loginId的k-v结构。
对于整个会话,我们会存储一个loginId-session的k-v结构。
基于这个存储结构我们就可以方便的实现这三种模式。
Session结构体
session包括了多个tokenValue,这就是我们用来实现同一用户多次登录多token,或者同一用户多次登录共享一个token的关键点
总之,我们实现的业务将基于这两种k-v结构
3|0功能实现
源码:https://github.com/weloe/token-go/blob/f58ba4d93f0f012972bf6a35b9127229b5c328fe/enforcer.go#L167
我们再来梳理一些功能和配置的对应关系
同一用户只能登录一次:IsConcurrent == false
同一用户多次登录多token: IsConcurrent == true && IsShare == false
这时候配置MaxLoginCount
才生效
同一用户多次登录共享一个token: IsConcurrent == true && IsShare == true
接着我们再讲讲登录的具体流程:
我们大致将它分为几个阶段:
-
生成token
-
生成session
-
存储token-id , id-session
-
返回信息
-
调用watcher和logger
-
检测登录人数
3|1生成token
生成token的时候,我们要判断他是否是可多次登录,也就是isConcurrent
是否为false
。
如果可多次登录并且共享token即IsConcurrent == true && IsShare == true
,就判断能否复用之前的token
这里我们还允许用户自定义token。
loginModel *model.Login
是为了支持自定义这几个参数
3|2生成session
https://github.com/weloe/token-go/blob/f58ba4d93f0f012972bf6a35b9127229b5c328fe/enforcer.go#L183
先判断是否已经存在session,如果不存在需要先创建,避免空指针
3|3存储
https://github.com/weloe/token-go/blob/f58ba4d93f0f012972bf6a35b9127229b5c328fe/enforcer.go#L192
在存储的时候,需要拼接key防止与其他的key重复
3|4返回token
这个操作对应我们配置的TokenConfig的IsReadCookie
、IsWriteHeader
和CookieConfig
3|5调用watcher和logger
https://github.com/weloe/token-go/blob/f58ba4d93f0f012972bf6a35b9127229b5c328fe/enforcer.go#L210
在事件发生后回调,提供扩展点
3|6检测登录人数
https://github.com/weloe/token-go/blob/f58ba4d93f0f012972bf6a35b9127229b5c328fe/enforcer.go#L227
要注意的是检测登录人数需要配置IsConcurrent == true && IsShare == false
,也就是:同一用户多次登录多token模式,提供一个特殊值-1,如果为-1就认为不对登录数量进行限制,不然就开始强制退出,就是删除一部分的token
4|0测试
4|1同一用户只能登录一次
4|2同一用户多次登录多token
4|3同一用户多次登录共享一个token
至此,我们就实现了三种登录模式,
__EOF__

本文链接:https://www.cnblogs.com/weloe/p/17397071.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 我与微信审核的“相爱相杀”看个人小程序副业