本篇为用go设计开发一个自己的轻量级登录库/框架吧 - 秋玻 - 博客园 (cnblogs.com)的封禁业务篇,会讲讲封禁业务的实现,给库/框架增加新的功能。
源码:http://github.com/weloe/token-go
封禁业务也是在一般项目中比较常见的业务。我们也将它封装在库中作为功能之一。
我们同样使用adapter作为底层的存储结构,将封禁标示作为k-v结构存储。
把id和服务名称service作为key,把封禁的级别level作为value,以此我们能实现一些比较常见的封禁业务。
首先就是封禁方法,首先当然要校验一下参数,然后存储封禁标识。要注意的就是level要大于等于1,在封禁后也要调用我们的logger和watcher。
http://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
}
再来就是解除封禁的实现,很简单,只要删除我们封禁存的那条记录就可以了。
http://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
}
接着还需要提供几个方便使用的方法
分别用来判断是否被封禁,获得封禁的级别,获得封禁的剩余时间三个方法
http://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 != ""
}
http://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
}
http://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()
,在每个业务前获取封禁级别进行判断就可以简单的实现了。
8月31日消息,根据韩国媒体BusinessKorea报导,谷歌(Google)已经决定将用于下一代智能手机Pixel8系列搭载的第三代Tensor移动处理器,交由三星3nm制程技术来生产,预计将在2023年下半年正式推出。市场人士表示,谷歌将新一代的Tensor移动处理器交由三星3nm代工,这预计也将继续加强两家公司在智能手机处理器上的合作。△谷歌第一代Tensor移动处理器谷歌智能手机之前主要采用的是高通旗下的移动处理器。不过,谷歌和三星的合作下,谷歌在三星的Exynos移动处理器的架构下,推出了自研的第一代Tensor移动处理器,并在2021年首次用于旗下的Pixel6系列智能手机上。目前谷歌的第二代Tensor移动处理器也正在三星测试。而谷歌明年即将推出的Pixel8系列智能手机则将继续搭载由谷歌和三星合作研发的第三代Tensor移动处理器,将采用三星3nm工艺代工。但由于谷歌Pixel系列智能手机销量较低,2021年在全球智能手机市场的占有率仅3%,因此对于三星3nm工艺的带动作用相对较小。相比之下,台积电的3nm工艺则将会有苹果等大客户的支持。报导还表示,也有部分专家认为,
大家好,又见面了,我是全栈君。varStatus是<c:forEach>jstl循环标签的一个属性,varStatus属性。就拿varStatus=“status”来说,事实上定义了一个status名的对象作为varStatus的绑定值。该绑定值也就是status封装了当前遍历的状态,比如,可以从该对象上查看是遍历到了第几个元素:${status.count}我们常会用c标签来遍历需要的数据,为了方便使用,varStatus属性可以方便我们实现一些与行数相关的功能,如:奇数行、偶数行差异;最后一行特殊处理等等。先就varStatus属性常用参数总结下:{status.index}输出行号,从0开始。{status.count}输出行号,从1开始。{status.current}当前这次迭代的(集合中的)项{status.first}判断当前项是否为集合中的第一项,返回值为true或false{status.last}判断当前项是否为集合中的最后一项,返回值为true或falsebegin、end、step分别表示:起始序号,结束序号,跳跃步伐。如:<c:forEach
Part1前言大家好,上期分享了一篇ShiroOraclePadding反序列化漏洞无key的实战文章,这期讲一个MS12-020蓝屏漏洞的真实利用过程。这个案例源于2013年我在读研期间,印象是比较深的。在学校期间,我偶尔会帮网络部那边处理一些网站故障,还帮忙修补过安全漏洞。在那个年代,大学网站的漏洞是非常多的,基本上没有什么WAF设备防护。期间有一个大学网站大概是长时间没有人用,崩溃了,访问一直是卡死状态,服务器密码学校那边也不记得了。于是我就来了一顿操作,帮忙恢复了一下,中间也踩了不少坑。首先肯定是要想办法拿到服务器权限,然后帮学校把密码读出来,下面凭着记忆,把过程写出来。Part2研究过程Web应用层面首先对这个特殊任务进行分析,首先是Web应用层面上,可以找各种Web漏洞拿权限,比如SQL注入漏洞、上传漏洞、列目录漏洞、XSS盲打后台、找CMS公开或未公开的漏洞、框架漏洞等。但是本次案例中Web应用崩溃了,访问不了,所以这个思路不适用。中间件层面Web应用没法搞,接下来重点看中间件上有没有可突破的点。从搜索引擎网页快照上看,大致判断中间件是IIS6.0。对于IIS中间件,可利
前言第一趴---Docker容器圈简介Docker容器圈简介第二趴---Docker基本操作Docker基本操作容器圈容器这个新生事物,现在还可以说是新生事物吗?对于我们学生而言,我觉得没毛病,你说呢?容器技术可说重塑了整个云计算市场的形态,带动了一批年轻有为的容器技术儿,不过「容器」这个概念是Docker公司发明的么,不是,它只是众多Pass项目中的最底层,没人关注的那一部分而已。什么是Pass项目?Pass项目之所会被很多公司所接受,自然是因为解放了部分开发人员的劳动力,尽快干玩活儿早点下班。其依赖的就是「应用托管」的能力,在电脑上斗过地主的应该知道,托管了以后就会自动出牌,同样的道理,为了尽量的弥补本地和云上的环境差异,就出现了Pass开源项目。举个例子来说,运维人员小仙云上部署一个CloudFoundry项目,开发人员只需要简单的一行代码就可以实现将本地的应用部署到云上就这样一行代码就实现了将本地应用上传到云上,属实很轻松。那么这个命令执行的基本原理是怎样的?实际上,我们可以将其最核心的组件理解为一套应用的打包和分发机制。云上部署的CloudFoundry会为大部分编程语言定义
CreatedbyJerryWang,lastmodifiedonApr14,2014使用wiki末尾的report通过bolentity的set_property修改一个serviceorder的description,在SAT里面能够看到下列callstack:1.从containerproxy拿到attributepropertyobject(line16)2.从objectmodel根据attributename和当前BOLentity的objectname拿到attributeindex(line18)3.判断当前待修改的attribute是否满足修改条件:非readonly,且BOLentity是changeable(line23~line24)4.判断当前的attributevalue是否等于待修改的新value(line25)5.如果bolentity没有上锁,则calllockmethod(line29)6.将changedflag置位(line34)7.将bolentity的sendableflag置位(line37)8.在buffer里将attribute设成se
这篇文章主要从渲染进程的的视角,来看渲染过程,主线程做了那些事情,导航流程、GPU快速栅格化图像和浏览器主进程输入到显卡后缓冲区部分一带而过,之后文章详细介绍上一篇浏览器渲染(进程视角)文章从浏览器的进程模型演进分析了打开一个页面的渲染进程数量,及每个渲染页面的连接,上下文组等内容,那么对于渲染进程内所作的事情怎样的呢?页面生成流程页面生成流水线如上图页面生成过程中进程之间的关系如下:当用户在地址栏输入地址时,浏览器主进程处理输入信息(是输入内容还是请求url,如果是url,拼装协议),回车后的事件触发(beforeunload),启动加载状态,把url请求发送给网络进程网络进程收到url请求后,开始构建请求信息,查找本地副本资源缓存,查找缓存失败准备发起请求ip地址和端口的查找(查找dns缓存,失败直接查找dns)tcp连接(如果同域名请求大于6个,放入队列等待)发起http请求服务器处理请求返回信息处理响应头(重定向等操作),如果是html发送消息给浏览器进程准备渲染进程接受数据,直接发送给渲染进程(浏览器进程确认文档被提交后,会建立网络进程和渲染进程的数据通道)渲染进程收到提交文
ArrayList<String>listA=newArrayList<String>(); listA.add("Tom"); ArrayList<String>listB=newArrayList<String>(); listB.add("Brain"); listB.add("Tom"); listA.retainAll(listB); System.out.println(listA);复制上面是Java取交集的方法,那么iOS是如何实现的?NSArray*array1=@[@"1",@"2",@"3"]; NSArray*array2=@[@"1",@"5",@"6"]; NSMutableSet*set1=[NSMutableSetsetWithArray:array1]; NSMutableSet*set2=[NSMutableSetset
本文收集整理使用Xamarin开发iOS应用时可能会遇到的各种问题。需要注册AppleDeveloperPortal不管你用什么开发iOS应用,成为一个Apple的开发者是必要的。访问:https://developer.apple.com/register/登录同意协议完成!虽然简单,但是如果没有成为开发者,那么你在所有工具上都无法成功部署应用。CouldnotfindanyavailableprovisioningprofilesforiOS这个错误可能出现在你是用VisualStudio或者VisualStudioforMac部署真机调试的时候出现。只有XCode才能生成provisioningprofiles!所以,如果你希望只使用VisualStudio或者VisualStudioForMac或者Xamarin来部署是不可能的。如果出现了此错误,你需要使用XCode提前生成一份provisioningprofiles然后在VisualStudio中使用这份profiles。方法:在XCode中新建一个项目;填写BundleIdentifier:注意:必须写成跟你待会儿用Vis
前言对于一名开发者来说,找出并处理掉Bug是不可或缺的能力。能够熟练的调试程序将大大提升开发的效率。学好DeBug,再多Bug也不怕。Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化。通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码。在IntellijIDEA中使用好Debug,主要包括如下内容:Debug开篇基本用法&快捷键变量查看计算表达式智能步入断点条件设置多线程调试回退断点中断Debug一、DeBug开篇首先看下IDEA中Debug模式下的界面。如下是在IDEA中启动Debug模式,进入断点后的界面,我这里是Windows,可能和Mac的图标等会有些不一样。就简单说下图中标注的8个地方:1.以Debug模式启动服务,左边的一个按钮则是以Run模式启动。在开发中,我一般会直接启动Debug模式,方便随时调试代码。2.断点:在左边行号栏单击左键,或者快捷键Ctrl+F8打上/取消断点,断点行的颜色可自己去设置。3.Debug窗口:访问请求到达第一个断点后,会自动激
R语言第二章数据处理③删除重复数据================================================这篇主要介绍如何在R中识别和删除重复数据。主要用的到Rbase和dplyr函数:duplicated():用于识别重复的元素和 unique():用于提取唯一元素, distinct()[dplyrpackage]删除数据框中的重复行。 x<-c(1,1,2,4,5,4,6) duplicated(x) ##[1]FALSETRUEFALSEFALSEFALSETRUEFALSE x[duplicated(x)] ##[1]14 x[!duplicated(x)] ##1,12,4,5,6复制根据某一列删除数据框中重复值#RemoveduplicatesbasedonSepal.Widthcolumns my_data[!duplicated(my_data$Sepal.Width),] ###Atibble:23x5 ##Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies ##<dbl&g
前言 在项目中我们一般会为实际问题域定义领域数据模型,譬如开发VDOM时自然而言就会定义个VNode数据类型,用于打包存储、操作相关数据。clj/cljs不单内置了List、Vector、Set和Map等数据结构,还提供deftype和defrecord让我们可以自定义数据结构,以满足实际开发需求。定义数据结构从DataType和Record开始 提及数据结构很自然就想起C语言中的struct,结构中只有字段并没有定义任何方法,而这也是deftype和defrecord最基础的玩法。 示例(deftypeVNode1[tagprops]) (defrecordVNode2[tagprops]) (defvnode1 (VNode1."DIV"{:textContent"Helloworld!"})) ;;或(->VNode1"DIV"{:textContent"Helloworld!"}) (defvnode2 (VNode2."DIV"{:textContent"H
选自Nextplatform作者:NicoleHemsoth机器之心编译参与:李泽南、李亚洲随着摩尔定律终点的临近和机器学习对计算需求的提升,人们对于开发下一代计算机芯片的呼声正变得高涨。在量子计算、FPGA、高性能GPU以外,神经形态计算是另一个有前途的发展方向。斯坦福大学的KwabenaBoahen教授等人在这一领域耕耘多年,最近,他们准备推出新一代芯片「Brainstorm」。如果你熟悉KwabenaBoahen,你可能会记得20世纪90年代末出现的人工视网膜芯片。这种视网膜视觉系统是由Boahen在加州理工学院(VLSI)的神经形态工程学计算机先驱CarverMead的带领下开发的,这一系统的思路在最近几年再次成为了科技界的关键词——计算机视觉、人工智能,还有受大脑结构启发改进软硬件的效率和性能。Boahen在接下来的十几年中一直致力于将生物工程引入计算机行业,这可能会是未来几年科学的正确方向——而且现在研究人员可以获得前所未有的大量数据。「这不是在正确的时间出现在正确的地点,」Boahen认为他将整个职业生涯用在神经计算,并在近几年获得进展的原因在于这项技术直到最近才出现的商
inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。下面就是我的inode学习笔记,尽量保持简单。===================================理解inode作者:阮一峰一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个sector组成一个block。文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大
做了discuzapiforjava 第三方应用项目的注册登陆。但是在修改用户名长度的时候。出现了小bug。找到解决发现是自身原因。在discuz根目录下面有两个相关的文件夹uc_client和 uc_server在自己的java项目里面的配置文件调用到了uc_server下面的model里面的user.php。里面有验证用户名长度。图片有代码。也要把uc_client下面的model里面的user.php。里面有验证用户名长度修改。需要完全修改用户名长度的方法 然后,修改Discuz!X库表pre_xxx 1 pre_common_adminnote:admin[varchar(50)] √ 2 pre_common_banned:admin[varchar(50)] √ 3 pre_common_card_log:username[varchar(50)] √ 4 pre_common_diy_data:username[varchar(50)] √ 5 pre_commo
稿件由路可比特整理自《区块链生存训练》「导读」介绍完区块链中的十多个概念还是总结一下吧你也一定很期待▍区块链的自组织体系区块链中的十多个概念,用一张图把这些概念串一遍,大家可以看到区块链是一个多因素相互制衡的反馈系统,这也是我们被其精妙的设计所迷住的一个主要原因。区块链的自组织体系图图的顶部是区块链,就是一个全世界共同维护的公开大账本,一个区块就是子账本,用区块高度来定位,我们生活在社会中,存在着大量商业往来,就有交易的需求,也就是价值转移的需求。但我们大量的个体之间互相并不认识,我给你发了货,你不给我钱怎么办?而区块链技术就实现了这种去中心化网络环境中的可信的价值传递,也有效地解决了拜占庭将军问题和双重支付问题。我们安装钱包软件,同步下载超过150GB以上的大账本数据,我向你的比特币地址发送1个BTC,运用公钥、私钥、非对称加密原理,建立一笔交易,发布到整个比特币网络上,这些交易数据通过合法性验证后,在整个网络中迅速传播。矿工收到成百上千的交易数据后,会根据交易手续费从高到低排序,运用专业的显卡设备,开始了超大工作量的HASH计算,提交一份PoW工作量证明,第一个完成计算的矿工获得了
webstorm支持了我们在代码上打断点,然后就可以在编辑器里debug自己的js代码,废话不说看一下怎么配置,需要的朋友可以参考下 一、JavaScript的调试 目前火狐和Chrome都具备调试JavaScript的功能,而且还是相当的强大。如果纯粹是用浏览器来进行js调试的话,我比较喜欢用火狐。火狐可以安装各种插件,真的是非常适合开发者。不过今天的主角并不是火狐,也不是Chrome,而是号称最智能的JavaScriptIDE:WebStorm。 WebStorm是jetbrains公司旗下一款JavaScript开发工具。被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScriptIDE”等。与IntelliJIDEA同源,继承了IntelliJIDEA强大的JS部分的功能。 其实WebStorm之所以支持调试JavaSccript,其实也是借助了Chrome,只要Chrome安装JetBrainsIDESupport插件,就可以直接在WebStorm里面进行调试了,效果那是非常的强大。 二
使用这个工厂的配置,可以很方便的获取配置文件中的属性。具体使用如下; 对于属性配置,一般采用的是键值对的形式,如: key=value 属性配置文件一般使用的是XXX.properties,当然有时候为了避免eclipse把properties文件转码,放到服务器上认不出中文,可以采用XXX.conf的形式管理属性配置。 spring对于属性文件有自己的管理方式,通过spring的管理,可以直接使用@Value的方式直接得到属性值。 先使用org.springframework.beans.factory.config.PropertiesFactoryBean对属性配置文件进行管理。 1.新建一个Javaproject,命名spring_test; 2.导入jar包: aopalliance-1.0.jar commons-logging-1.1.1.jar org.springframework.test-3.1.0.RELEASE.jar spring-aop-3.1.1.RELEASE.jar spring-asm-3.1.1.RELEASE.jar spring-beans
1、卸载已有的python3 #卸载pyhton3 [root@kycxnode111~]#rpm-qa|greppython3|xargsrpm-ev--allmatches--nodeps 软件包准备中... python3-libs-3.6.8-13.el7.x86_64 python3-pip-9.0.3-7.el7_7.noarch python3-setuptools-39.2.0-10.el7.noarch python3-3.6.8-13.el7.x86_64 #删除所有残余文件 [root@kycxnode111~]#whereispython3|xargsrm-frv 已删除目录:"/usr/lib/python3.6/site-packages/__pycache__" 已删除目录:"/usr/lib/python3.6/site-packages" 已删除目录:"/usr/lib/python3.6" #查看目前系统中的python [root@kycxnode111~]#whereispython python:/usr/bin/python/usr/b
在vue-cli移动项目中,使用vant底部切换,例如:/mine和/mine/collect都需要"我的"高亮,点击"我的",回到/mine页面。使用vant文档中的tabbarchange方法,点击"我的"不能触发change事件,所以可以点击每个item实现。刷新也要保留指定页面高亮。 页面数据可以循环显示,为了展示自定义图标,这里没有做data数据。 <van-tabbarv-model="active"active-color="#ee0a24"inactive-color="#000":placeholder="true"> <van-tabbar-itemicon="home-o"@click="onClick('/')">首页</van-tabbar-item> <van-tabbar-item@click="onClick('/market')"> <span>自定义</span> <template#icon="props"> <img:src="props.active?ic
设置ftp的软件很多。winserver系统自带。刚才设置成功一个。记录一下过程,分享一下。网上的一些前提还是必须要做的。加角色。就不截图了。在计算机,右键管理,然后在角色下面,添加iis服务。里面有选项是ftp。要全部选上。添加以后,防火墙会自动把这个ftp需要的端口,自动添加到允许的范围。这个我添加完角色,启动服务以后。就是自动配置好的。不需要在手动了。下面的截图就是配置ftp的过程 添加ftp站点 这个SSL默认是需要,没有特殊需要,选无就可以。我就是用的默认,结果弄了几次。都是本地自己访问自己的ftp就打不开。 这个可以随便用个账户,点击完成后,可以在设置的。 如果在ad下,在这里加入域名。 访问用户都要在这里设置,一开始没找到。怎么输入用户名密码也不对。 这样ftp就设置好了。测试方法 本机在地址栏输入 ftp://localhost 就可以了。