用go设计开发一个自己的轻量级登录库/框架吧
用go设计开发一个自己的轻量级登录库/框架吧
几乎每个项目都会有登录,退出等用户功能,而登录又不单仅仅是登录,我们要考虑很多东西。
token该怎么生成?生成什么样的?
是在Cookie存token还是请求头存token?读取的时候怎么读取?
允许同一个账号被多次登录吗?多次登录他们的token是一样的?还是不一样的?
登录也有可能分成管理员登录,用户登录等多种登录类型
我们要做的就是把这些东西封装到一起,然后能更方便的使用
而完成这些最难的就是如何设计架构了,其实要简单的封装一下并不难,本篇要讲的就是如何进行架构的设计了。
源码:weloe/token-go: a light login library (github.com)
Enforcer
我们可以抽象出一个供外部调用的执行器,它包括以下几个部分
token-go/enforcer.go at master · weloe/token-go (github.com)
type Enforcer struct {
// 从配置文件读取配置需要
conf string
// 登录类型
loginType string
config config.TokenConfig
// 生成token的函数
generateFunc model.GenerateTokenFunc
// 用于存储数据
adapter persist.Adapter
// 监听器
watcher persist.Watcher
// web上下文
webCtx ctx.Context
// 用于记录日志
logger log.Logger
}
执行器的接口,包含供外部调用的方法
token-go/enforcer_interface.go at master · weloe/token-go · GitHub
var _ IEnforcer = &Enforcer{}
type IEnforcer interface {
Login(id string) (string, error)
LoginByModel(id string, loginModel *model.Login) (string, error)
Logout() error
IsLogin() (bool, error)
IsLoginById(id string) (bool, error)
GetLoginId() (string, error)
Replaced(id string, device string) error
Kickout(id string, device string) error
GetRequestToken() string
SetType(t string)
GetType() string
SetContext(ctx ctx.Context)
GetAdapter() persist.Adapter
SetAdapter(adapter persist.Adapter)
SetWatcher(watcher persist.Watcher)
SetLogger(logger log.Logger)
EnableLog()
IsLogEnable() bool
GetSession(id string) *model.Session
SetSession(id string, session *model.Session, timeout int64) error
}
Config
首先就是根据需求抽象出配置信息
一个是cookie的配置
token-go/cookie.go at master · weloe/token-go · GitHub
type CookieConfig struct {
Domain string
Path string
Secure bool
HttpOnly bool
SameSite string
}
一个是token的配置
token-go/token.go at master · weloe/token-go · GitHub
type TokenConfig struct {
// TokenStyle
// uuid | uuid-simple | random-string32 | random-string64 | random-string128
TokenStyle string
TokenName string
Timeout int64
// 允许多次登录
IsConcurrent bool
// 多次登录共享一个token
IsShare bool
// If (IsConcurrent == true && IsShare == false)才支持配置
// If IsConcurrent == -1, 不检查登录数量
MaxLoginCount int16
// 读取token的方式
IsReadBody bool
IsReadHeader bool
IsReadCookie bool
// 是否把token写入响应头
IsWriteHeader bool
CookieConfig *CookieConfig
}
Adapter
adapter是底层用来存储数据的结构,为了兼容不同的实现(不同的存储方式),设计成一个接口。
token-go/adapter.go at master · weloe/token-go · GitHub
type Adapter interface {
// GetStr string operate string value
GetStr(key string) string
// SetStr set store value and timeout
SetStr(key string, value string, timeout int64) error
// UpdateStr only update value
UpdateStr(key string, value string) error
// DeleteStr delete string value
DeleteStr(key string) error
// GetStrTimeout get expire
GetStrTimeout(key string) int64
// UpdateStrTimeout update expire time
UpdateStrTimeout(key string, timeout int64) error
// Get get interface{}
Get(key string) interface{}
// Set store interface{}
Set(key string, value interface{}, timeout int64) error
// Update only update interface{} value
Update(key string, value interface{}) error
// Delete delete interface{} value
Delete(key string) error
// GetTimeout get expire
GetTimeout(key string) int64
// UpdateTimeout update timeout
UpdateTimeout(key string, timeout int64) error
}
Context
我们需要从请求读取token,可能也需要写出token,因此需要兼容不同的web上下文,我们需要设计一个Context接口
token-go/context.go at master · weloe/token-go · GitHub
type Context interface {
Request() Request
Response() Response
ReqStorage() ReqStorage
MatchPath(pattern string, path string) bool
IsValidContext() bool
}
Watcher
监听器,用于在一些事件发生的时候进行一些其他操作。
token-go/watcher.go at master · weloe/token-go · GitHub
// Watcher event watcher
type Watcher interface {
// Login called after login
Login(loginType string, id interface{}, tokenValue string, loginModel *model.Login)
// Logout called after logout
Logout(loginType string, id interface{}, tokenValue string)
}
Logger
Logger,用于记录日志,方便debug等等,需要设计成可以自由开启关闭。
token-go/logger.go at master · weloe/token-go · GitHub
type Logger interface {
persist.Watcher
// Enable turn on or off
Enable(bool bool)
// IsEnabled return if logger is enabled
IsEnabled() bool
}
到此,项目的大致的结构就设计完成,下一篇会讲讲本业务的具体实现
用go设计开发一个自己的轻量级登录库/框架吧的更多相关文章
- HTML5实战教程———开发一个简单漂亮的登录页面
最近看过几个基于HTML5开发的移动应用,比如臭名昭著的12036移动客户端就是主要使用HTML5来实现的,虽然还是有点反应迟钝,但已经比较流畅了,相信随着智能手机的配置越来越高性能越来越好,会越来越 ...
- 准备开发一个基于canvas的图表库,记录一些东西(一)
开源的图表库已经有很多了,这里从头写个自己的,主要还是 提高自己js的水平,增加复杂代码组织的经验 首先写一个画图的库,供以后画图表使用.经过2天的开发,算是能拿出点东西了,虽然功能还很弱,但是有了一 ...
- 【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(二)】
此学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学习效果很好的 ...
- Smart Framework:轻量级 Java Web 框架
Smart Framework:轻量级 Java Web 框架 收藏 黄勇 工作闲暇之余,我开发了一款轻量级 Java Web 框架 —— Smart Framework. 开发该框架是为了: 加 ...
- 给力的轻量级JavaScript动画框架 - jsMorph
jsMorph 是一个独立的轻量级 JavaScript 动画框架,可以用它来操纵多个 HTML 元素的样式,实现动画效果.此框架会自动检测起始位置.转换单位.调整渲染的速度,以此来获得更流畅的渲染体 ...
- 使用Python开发轻量级的Web框架以及基于WSGI的服务器来实现一个网站页面
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目说明 二丶数据准备 三丶使用网络TCP开发一个基于WSGI协议的Web服务器 四丶使用python3开发一个轻量级的 ...
- HBase概念学习(八)开发一个类twitter系统之表设计
这边文章先将可能的需求分析一下,设计出HBase表,下一步再開始编写client代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,參考HBase实战这本书实际动手做了这个样例. ...
- [转]轻量级 Java Web 框架架构设计
工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...
- 一个高性能、轻量级的分布式内存队列系统--beanstalk
Beanstalk是一个高性能.轻量级的.分布式的.内存型的消息队列系统.最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟.其实Beanstalkd是典型的类Mem ...
- 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)
本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...
随机推荐
- The difference of src and href
href是Hypertext Reference的缩写,表示超文本引用.用来建立当前元素和文档之间的链接.常用的有:link.a.例如: <link href="reset.css&q ...
- centos安装k8s注意点
安装方法,参考 https://blog.csdn.net/frankgy01/article/details/127936367 https://www.cnblogs.com/yangzp/p/1 ...
- JavaScript数组常用的方法总结
数组常用方法 concat() 方法 concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. var arr = new Array(3) arr ...
- FFT及NTT
FFT--快速傅里叶变换(附NTT--快速数论变换) FFT是一种能在O(nlogn)时空复杂度内求解两个函数卷积的优秀算法. 算法思想(DFT): 对于函数 \(f(x)=\Sigma_{i=0}^ ...
- ASP.NET Web应用程序(.NET Framework)开发网站
1.创建项目 2.控制器脚本说明 [FromBody]JObject value:JObject此类型默认为string,但是string无法正常解析复杂类型的Json数据,所以修改为JObject类 ...
- LoadRunner——安装教程以及创建与录制(一)
theme: channing-cyan 1. loadrunner12|loadrunner12官方版下载(附安装教程)+网盘下载+汉化包 CSDN下载及安装教程: https://blog.csd ...
- JavaWeb学习笔记第三弹
一.数据库设计 1.软件研发步骤 2.数据库设计概念 建立数据库中的表结构以及表与表之间的关联关系的过程 3.数据库设计的步骤 表关系:一对一.一对多(多对一).多对多 表关系之一对多 表关系之多对多 ...
- Javaweb基础复习------JSON相关知识
JSON(JavaScript对象表示法) 首先,我们需要知道的是,要使用json语法的话,就需要在Maven项目中导入相关的包,可以参考我之前发过的那个Maven导包那个网址,在里面找到这个页面: ...
- BOW/DOM(上)
BOM 原生对象:成为js中的内置对象,就是由 js 中的构造函数创建的对象就被称为原生对象:Object.Number.Array.Date.String.... 宿主对象:web运行环境,也就是w ...
- 全网最详细中英文ChatGPT接口文档(一)开始使用ChatGPT——导言
目录 Introduction 导言 Overview 概述 Key concepts 关键概念 Prompts and completions 提示和完成 Tokens 标记/符号 Models 模 ...