用go封装一下封禁功能

这篇具有很好参考价值的文章主要介绍了用go封装一下封禁功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用go封装一下封禁功能

本篇为用go设计开发一个自己的轻量级登录库/框架吧 - 秋玻 - 博客园 (cnblogs.com)的封禁业务篇,会讲讲封禁业务的实现,给库/框架增加新的功能。

源码:https://github.com/weloe/token-go

思路

封禁业务也是在一般项目中比较常见的业务。我们也将它封装在库中作为功能之一。

我们同样使用adapter作为底层的存储结构,将封禁标示作为k-v结构存储。

把id和服务名称service作为key,把封禁的级别level作为value,以此我们能实现一些比较常见的封禁业务。

实现

首先就是封禁方法,首先当然要校验一下参数,然后存储封禁标识。要注意的就是level要大于等于1,在封禁后也要调用我们的logger和watcher。

https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#L390

// Banned ban user, if time == 0,the timeout is not set
func (e *Enforcer) Banned(id string, service string, level int, time int64) error {
	if id == "" || service == "" {
		return fmt.Errorf("parameter cannot be nil")
	}
	if level < 1 {
		return fmt.Errorf("unexpected level = %v, level must large or equal 1", level)
	}
	err := e.adapter.SetStr(e.spliceBannedKey(id, service), strconv.Itoa(level), time)
	if err != nil {
		return err
	}

	// callback
	e.logger.Ban(e.loginType, id, service, level, time)
	if e.watcher != nil {
		e.watcher.Ban(e.loginType, id, service, level, time)
	}

	return nil
}

再来就是解除封禁的实现,很简单,只要删除我们封禁存的那条记录就可以了。

https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#LL412C6-L412C6

// UnBanned Unblock user account
func (e *Enforcer) UnBanned(id string, services ...string) error {
	if id == "" {
		return fmt.Errorf("parmeter id can not be nil")
	}
	if len(services) == 0 {
		return fmt.Errorf("parmeter services length can not be 0")
	}

	for _, service := range services {
		err := e.adapter.DeleteStr(e.spliceBannedKey(id, service))
		if err != nil {
			return err
		}
		e.logger.UnBan(e.loginType, id, service)
		if e.watcher != nil {
			e.watcher.UnBan(e.loginType, id, service)
		}
	}
	return nil
}

接着还需要提供几个方便使用的方法

分别用来判断是否被封禁,获得封禁的级别,获得封禁的剩余时间三个方法

https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#L434

判断是否被封禁

// IsBanned if banned return true, else return false
func (e *Enforcer) IsBanned(id string, services string) bool {
	s := e.adapter.GetStr(e.spliceBannedKey(id, services))

	return s != ""
}

https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#L441

获得封禁的级别

// GetBannedLevel get banned level
func (e *Enforcer) GetBannedLevel(id string, service string) (int64, error) {
	str := e.adapter.GetStr(e.spliceBannedKey(id, service))
	if str == "" {
		return 0, fmt.Errorf("loginId = %v, service = %v is not banned", id, service)
	}
	time, err := strconv.ParseInt(str, 10, 64)
	if err != nil {
		return 0, err
	}
	return time, nil
}

https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#L454

获得封禁的剩余时间

// GetBannedTime get banned time
func (e *Enforcer) GetBannedTime(id string, service string) int64 {
	timeout := e.adapter.GetStrTimeout(e.spliceBannedKey(id, service))
	return timeout
}

有了这几个方法,我们就可以使用token-go更为方便是实现登录业务了。

对于一般的业务,我们其实可以无视封禁级别。只需要使用Banned()进行封禁,在每个需要校验是否被封禁的业务前进行IsBanned()的判断就行了。

测试例子:

func TestEnforcer_Banned(t *testing.T) {
	err, enforcer, _ := NewTestEnforcer(t)
	if err != nil {
		t.Fatalf("NewTestEnforcer() failed: %v", err)
	}
	err = enforcer.Banned("1", "comment", 1, 100)
	if err != nil {
		t.Fatalf("Banned() failed: %v", err)
	}
	isBanned := enforcer.IsBanned("1", "comment")
	if !isBanned {
		t.Errorf("unexpected isBanned is false")
	}

	err = enforcer.UnBanned("1", "comment")
	if err != nil {
		t.Fatalf("UnBanned() failed: %v", err)
	}
	isBanned = enforcer.IsBanned("1", "comment")
	if isBanned {
		t.Errorf("unexpected isBanned is false")
	}
}

当然我们对于一个业务会有一些较为复杂的封禁,比如discuss交流业务,如果级别为1我们会禁止评论,如果级别为2我们会禁止评论和点赞,级别为3我们会禁止评论、点赞和收藏。

这个时候我们只需要再加上GetBannedLevel(),在每个业务前获取封禁级别进行判断就可以简单的实现了。文章来源地址https://www.toymoban.com/news/detail-458658.html

到了这里,关于用go封装一下封禁功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小程序“手机号授权功能”被封禁,提示由于小程序违规该功能无法使用,整改申诉2次,均未通过,如何处理?

    前景:由于小程序登陆页面,没有用户隐私协议,有点强制性用户登陆了,所以遭到了手机号授权功能封禁。如下图,然后根据提示做了整改。 收到了小程序服务能力封禁的通知,点击查看详情可以进行申诉,但是要⚠️⚠️⚠️  申诉只有两次机会,如果用光之后,申诉按

    2024年01月22日
    浏览(186)
  • 【Linux】封装一下简单库 && 理解文件系统

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、封装一下简单库 二、理解一下stdin(0)、stdout(1)、stderr(3) 2.1、为什么要有0、1、2呢? 2.2、特点 2.3、如果我想让2也和1重定向到一个文件中? 三、理解文件系统 3.1、看看物理磁盘 3.2、了解

    2024年04月22日
    浏览(41)
  • 【Go语言开发】简单了解一下搜索引擎并用go写一个demo

    这篇文章我们一起来了解一下搜索引擎的原理,以及用go写一个小demo来体验一下搜索引擎。 搜索引擎一般简化为三个步骤 爬虫:爬取数据源,用做搜索数据支持。 索引:根据爬虫爬取到的数据进行索引的建立。 排序:对搜索的结果进行排序。 然后我们再对几个专业名词做

    2024年02月16日
    浏览(44)
  • 简单对比一下 C 与 Go 两种语言

    以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/U6jIT837x5Yxe6Ev1aMDsA 使用一个简单的计数程序将古老的 C 语言与现代 Go 进行比较。 Go 是一种现代编程语言,追溯其历史大部分源自编程语言 C。所以,任何熟悉 C 语言的开发者

    2024年02月11日
    浏览(42)
  • go语言(十)---- 面向对象封装

    面向对象的封装 可以看出修改后,li4,数据并没有变化 如果加入指针,进行li4的修改后,数据会发生变化 如果首字母大写,表示其他包也能够访问 如果类的属性首字母大写,表示该属性对外是能够访问的,否则的话,只能类的内部访问。

    2024年01月20日
    浏览(42)
  • Go访问Redis代码封装

    GO中可用于访问Redis的依赖包有下边4个: https://github.com/gomodule/redigo https://github.com/go-redis/redis https://github.com/bsm/redeo https://github.com/shomali11/xredis 其中go-redishttps://redis.uptrace.dev/zh/是与Redis官方有合作的,在Github的收藏数量也是最多,本文使用go-redis。 go-redis中文教程:https://red

    2024年02月12日
    浏览(35)
  • 掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)

    在Go语言中,结构体(Struct)是一种自定义的数据类型,用于封装不同类型的数据字段。结构体可以看作是一种用户自定义的数据结构,用于组织和管理相关的数据。结构体由一组字段(Fields)组成,每个字段可以是不同的数据类型,可以是基本类型(如整数、浮点数、布尔

    2024年03月26日
    浏览(53)
  • Ajax&JavaScript&css模仿百度一下模糊查询功能

    如下图所示,我们在输入大学时,程序会到后端查询名字中包含大学的数据,并展示到前端页面。 用户选择一个大学,该大学值会被赋值到input表单,同时关闭下拉表单; 当页面展示的数据都不符合条件时,用户点击空白处,可关闭表单。

    2024年02月09日
    浏览(51)
  • 用go封装和实现扫码登录

    本篇为用go设计开发一个自己的轻量级登录库/框架吧 - 秋玻 - 博客园 (cnblogs.com)的扫码登录业务篇,会讲讲扫码登录的实现,给库/框架增加新的功能,最后说明使用方法 Github:https://github.com/weloe/token-go 首先我们需要知道扫码登录流程 打开登录页面,展示一个二维码,同时轮

    2024年02月08日
    浏览(47)
  • 从 Context 看 Go 设计模式:接口、封装和并发控制

    在 Go 语言中, context 包是并发编程的核心,用于传递取消信号和请求范围的值。但其传值机制,特别是为什么不通过指针传递,而是通过接口,引发了我的一些思考。 考虑以下典型的代码片段: 这段代码展示了在 Go 中创建和传递 context 的简单用法。但背后的设计理念和实现

    2024年01月20日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包