本篇为用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 setfunc (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}// callbacke.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 accountfunc (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 falsefunc (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 levelfunc (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 timefunc (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()
,在每个业务前获取封禁级别进行判断就可以简单的实现了。
标签:
精彩推荐
近日,恩捷股份旗下珠海恩捷收到日本PrimePlanetEnergy&Solutions,Inc (简称:PPES)的供应商提名信,已确
南方财经全媒体记者郑嘉意北京报道近年来,随着我国人口红利递减、保险潜在客户对代理人专业性要求提高等因
中国报告大厅2023年5月24日二乙二醇二甲醚价格最新走势监测显示:济南普莱华化工有限公司报价机构,今日二
湖人罚球数据出炉!季后赛16场罚球397次,打勇士4场多80个罚球,勇士,湖人主场,丹佛掘金队,孟菲斯灰熊队
近年来,全球含糖饮料的消费量不断增加,同时也有证据表明,含糖饮料高消费会导致肥胖以及相关疾病、2型糖
每经AI快讯,当地时间24日,阿富汗阿里亚纳航空公司表示,正式恢复阿富汗首都喀布尔和中国乌鲁木齐市之间的
《经典咏流传·正青春》正在央视热播,新一期节目中,继续“和诗以歌”,用融合的音乐呈现古典诗词的艺...
1、武汉森德是国内最早从事高压测试的厂家之一。2、公司位于国家级高新技术开发区武汉东湖新技术开发区内。
日前,淮北市退役军人事务局、市发改委、市财政局、市交通运输局四部门联合印发《淮北市退役军人和其他优抚
【广东一工厂大火炸出蘑菇云】据阳江消防,5月23日上午10时50分阳东区一企业油漆仓库起火。11时40分许,火
昨天下午,第十八届、第十九届中国电影华表奖红毯仪式在国家体育馆举行,《长津湖》主创团队在黄建新、陈
5月24日上午,PET铜箔板块震荡走高,宝明科技逼近涨停,方邦股份、元琛科技、骄成超声、隆扬电子等跟涨。消
“讲台上冒烟啦!”“老师的手掌着火啦!”在宜章县莽山乡民族学校教室里,孩子们的惊呼声此起彼伏。别...
因此成绩查询入口和查分网站的准确性和及时性非常重要,为了方便广东河源考生和家长查询成绩,©无忧考网特
(解博匀李明杰何娟)据石家庄海关23日消息,今年1月至4月,河北省对中亚五国进出口14亿元,比去年同期增长31
记者近日从集大原高铁大同段建设现场获悉,集大原高铁大同段建设正快速推进,目前土建工程已完成总量的60%
连云港市水利局:组织召开凰窝水库除险加固工程推进会议为加快推进凰窝水库除险加固,确保汛前完成水下工程
快看,太空中又多了一只“兔子”!5月21日下午四点,武汉大学“珞珈二号01星”随长征二号丙运载火箭,在...
今日,湖人召开了季末新闻发布会,比斯利接受了媒体采访。谈到赛季中加盟湖人,比斯利表示:“我们得到...
2023张韶涵「寓言」巡回演唱会太原站地点在山西体育中心体育场,时间为2023 06 24周六开始。
5月23日北向资金减持16 87万股云南锗业。近5个交易日中,获北向资金减持的有3天,累计净减持41 01万股。近2
1、叶黄素胶囊应该每天三次一次一片对缓解眼睛疾病有一定的好处。本文到此分享完毕,希望对大家有所帮助。
1、企业名称:杭州盛世龙吟数码科技有限公司2、法定代表人:俞欢类型:有限责任公司(自然人投资或控股)3、
近日,北京轨道交通大兴机场线刷掌乘车服务正式上线,乘客通过注册开通微信刷掌乘车服务,即可在乘坐该条地
福建省住房和城乡建设厅是本省房地产经纪活动的行政主管部门,负责指导、监督房地产经纪机构备案管理工作。
资讯News
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
05-25
聚焦Policy
当好农民工的“护薪人” 近日,罗某等7名农民工在收到被拖欠的工资后,纷纷打电话向江西省南昌市...
“通讯录里所有人都知道我欠钱了” □ 本报记者 韩丹东 □ 本报见习记者 张守坤 ...
大连宝马车撞人案肇事司机被判死刑 本报讯 记者韩宇 10月29日,辽宁省大连市中级人民法院一审...
医院财务迷上网络赌博输光5000万元公款 □ 本报记者 马维博 □ 本报通讯员 汪宇堂 曹...
辊环车削 雕琢毫厘(工匠绝活) 【绝活看点】 23年来,雷虎始终扎根一线,改进钢材轧制工艺...
交警严查超标电动自行车挪用“白牌” 截至昨晚6时,处罚电动自行车违法行为共计6585笔;下一步将...
明起寒潮来袭 北方气温普降10℃以上 中央气象台预计,本周日北京平原地区最低气温降至-4℃左右...
多种蔬菜价格降幅达五成 包括菠菜、蒿子秆等 预计本月中旬蔬菜恢复供需平衡 本报讯(记者...
北京周日最低气温或达-4℃ 本报讯(记者 赵婷婷)北京青年报记者昨天从中央气象台获悉,新一股...
昌平一家四口确诊新冠肺炎 天通北苑第二社区升级为中风险地区 朝阳两涉疫校区及16所学校停课 ...