沧州三亚菏泽经济预测自然
投稿投诉
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产
菏泽德阳
山西湖州
宝鸡上海
茂名内江
三亚信阳
长春北海
西安安徽
黄石烟台
沧州湛江
肇庆鹤壁
六安韶关
成都钦州

GolangWeb框架Iris项目实战JWT和中间件(Mid

9月17日 长歌行投稿
  前文再续,上一回我们完成了用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。本回我们需要为登录成功的用户生成Token,并且通过Iris的中间件(Middleware)进行鉴权操作。Iris模板复用
  在生成Token之前,首先我们需要对项目的模板进行优化改造,目前存在的页面模板有三块,分别是:首页模板(index。html)、登录页模板(signin。html)、后台用户管理页模板(adminuser。html),虽然页面并不多,但不难发现,有很多重复的代码,比方说,首页模板和登录页模板都有公共的头部导航菜单,没必要每个模板都写一遍相同的代码,再比如,三块模板都会有axios的封装逻辑,也没必要三块模板封装三次,除此之外,以后模板多了,不做复用,就会出现维护困难的问题。
  首先提取页面模板的公共部分,比如头部导航,在views目录建立header。html:navclassnavbarnavbarinversenavbarfixedtopimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbrh3f793bdcd1fc9a80。jpgwidth16height16rolepresentationstylepointerevents:imgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbrh942e5434d52d5129。jpgwidth16height16rolepresentationstylepointerevents:buttontypebuttonclassnavbartogglecollapseddatatogglecollapsedatatargetnavbarariaexpandedfalseariacontrolsnavbarspanclasssronly菜单spanspanclassiconbarspanspanclassiconbarspanspanclassiconbarspanbuttonulclassnavnavbarnavliclassindexnavindexindexHomeliliclassindexnavindex1Pythonliliclassindexnavindex2WebDesignliliclassindexnavindex3DbSQLliliclassindexnavindex4MacLinuxliliclassindexnavindex5GoRubyliliclassindexnavindex6LifeWorkliliclassindexnavindex7Resumeliulimgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbrh3f793bdcd1fc9a80。jpgwidth16height16rolepresentationstylepointerevents:imgsrcc2021imgdataimg。jpgdatasrcimgq01。71396。comcbrh942e5434d52d5129。jpgwidth16height16rolepresentationstylepointerevents:nav
  随后,在需要头部导航的模板进行引入操作,比如修改signin。html:{renderheader。html}
  注意,使用{}是为了避免和前端的Vue。js标签冲突。
  同样地,将封装axios。js逻辑单独抽取出来myaxios。html:
  然后在需要的地方进行引入操作:{rendermyaxios。html}
  如此,我们只需要维护模板的公共部分即可。
  修改后,项目的结构如下:。README。mdassetscssstyle。cssjsaxios。jsvue。jsdatabasedatabase。gofavicon。icogo。modgo。sumhandleradmin。gouser。gomain。gomodelmodel。gomytoolmytool。gotmprunnerbuildviewsadminuser。htmladminheader。htmlheader。htmlindex。htmlmyaxios。htmlsignin。htmltest。htmlJWT生成逻辑
  JSONWebToken(JWT)是一个互联网应用的开放标准(RFC7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息,这种信息可以被验证和信任,因为它是数字签名的。
  说白了,登录成功以后,生成一个JSON对象,返回给前端,就像下面这样:{uid:1}
  这之后,用户与服务端通信的时候,所有请求都要带着这个JSON对象。服务器完全只靠这个对象认定用户身份。为了防止JSON对象被篡改,服务器在生成这个对象的时候,会加上签名,变成这种模样:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。eyJVaWQiOjEsImlhdCI6MTY2MTg0MjYxMCwiZXhwIjoxNjYxODQ1NjEwfQ。BXK9awvVCk7L3JAnDGt9z6U9TOjPCpI0AcHRu1eqmo
  这玩意就是普遍意义上的Token,俗称令牌。
  在我们的项目中,需要为登录校验通过的账号生成Token,首先安装jwt包:gogetugithub。comkatarasirisv12middlewarejwt
  随后修改本地的工具包mytool。jwt:packagemytoolimport(cryptomd5fmtiotimegithub。comdchestcaptchagithub。comkatarasirisv12github。comkatarasirisv12middlewarejwt)varSigKey〔〕byte(signaturehmacsecretsharedkey)typePlayLoadstruct{Uiduint}funcGenerateToken(uiduint)string{signer:jwt。NewSigner(jwt。HS256,SigKey,50time。Minute)claims:PlayLoad{Uid:uid}token,err:signer。Sign(claims)iferr!nil{fmt。Println(err)}s:string(token)returns}
  众所周知,Token由三部分组成:头部、载荷以及秘钥。这里SigKey字符为签名秘钥,PlayLoad结构体为载荷信息,这里通过签名生成一个字符格式的token,注意返回前端时,需要强转为字符串。
  需要注意的是,生成签名时使用的是HS256算法,同时为了确保安全性,token设置生命周期,这里为50分钟。
  随后修改用户登录逻辑,将生成好的token返回给前端:登录动作funcSignin(ctxiris。Context){ret:make(map〔string〕interface{},0)cid:ctx。PostValue(cid)code:ctx。PostValue(code)ifcaptcha。VerifyString(cid,code)false{ret〔errcode〕2ret〔msg〕登录失败,验证码错误ctx。JSON(ret)return}db:database。Db()deferfunc(){db。Close()}()Username:ctx。PostValue(username)Password:ctx。PostValue(password)user:model。User{}db。Where(model。User{Username:Username,Password:mytool。Makepassword((Password))})。First(user)ifuser。ID0{ret〔errcode〕1ret〔msg〕登录失败,账号或者密码错误ctx。JSON(ret)return}token:mytool。GenerateToken(user。ID)fmt。Println(token)ret〔errcode〕0ret〔msg〕登录成功ret〔username〕user。Usernameret〔token〕tokenctx。JSON(ret)}
  前端接收的返回值为:{errcode:0,msg:登录成功,token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。eyJVaWQiOjEsImlhdCI6MTY2MTg0MzI5MSwiZXhwIjoxNjYxODQ2MjkxfQ。547z3nv4qj2UeHTzfeGqSsnFZD2DFyCP9gNZQiHA,username:123}
  随后前端收到token后,将其存储localstorage,然后跳转到后台页面:登录请求signin:function(){this。myaxios(http:localhost:5000signin,post,{username:this。username,password:this。password,cid:this。cid,code:this。code})。then(data{console。log(data)alert(data。msg);localStorage。setItem(token,data。token);window。location。hrefadminuser});}
  localStorage存储是永久的,如果对安全性要求较高,可以采用sessionStorage,token生命周期就会跟随浏览器进程,但之前设置的token生命周期就没意义了,各有利弊,各自权衡。中间件(Middleware)鉴权
  所谓中间件,是一类提供系统软件和应用软件之间连接、便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息与资源。
  说白了,就是在所有需要鉴权的接口前面加一层逻辑,便于批量管理和控制:verifier:jwt。NewVerifier(jwt。HS256,mytool。SigKey)verifyMiddleware:verifier。Verify(func()interface{}{returnnew(mytool。PlayLoad)})
  这里声明中间件变量verifyMiddleware,该变量会返回一个载荷结构体对象。
  随后,为所有的后台接口、包括后台模板添加中间件:adminhandler:app。Party(admin)adminhandler。Use(verifyMiddleware)adminhandler。Get(userlist,handler。Adminuserlist)adminhandler。Delete(useraction,handler。Adminuserdel)adminhandler。Put(useraction,handler。Adminuserupdate)adminhandler。Post(useraction,handler。Adminuseradd)adminhandler。Get(user,handler。Adminuserpage)
  如此,所有后台操作都需要中间件的鉴权操作。
  换句话说,如果请求地址中没有token或者token不合法,就不会返回正常数据。
  访问:http:localhost:5000adminuser如图所示:
  如果带着token:
  当然了,之后所有的后台请求都需要携带token,所以改造上面封装的myaxios。html:
  藉此,每个后端请求都会携带token。结语
  JWT形式的认证体系将用户状态分散到了客户端中,相比于服务端的session存储,可以明显减轻服务端的内存压力,此外,使用Iris中间件鉴权的方式有助于提高代码的重用性,也更便于维护,更加优雅。该项目已开源在Github:https:github。comzcxey2911IrisBlog,与君共觞,和君共勉。
投诉 评论 转载

足协反赌扫黑能否一查到底近两年,中国男子足球接二连三毫无下限的一败再败,在40强和12强预选赛的赛场上丑态百出,被日韩暴揍,被越南泰国羞辱,错失参与世界杯的机会,伤透了中国球迷的心。或许正是此时高层痛……魏忠贤掌权时,努尔哈赤的军队为啥就是打不进来?要说在明朝当中的太监谁最出名的话,那毫无疑问的是魏忠贤了。而很多人都觉得明朝的没落与魏忠贤有关,而事实上魏忠贤也的确是一个奸臣,借用皇帝给他的权势杀了很多的无辜之人让当时的官员……神奇生物在哪里国际观鸟节新发现越冬大天鹅现身洞庭湖华声在线全媒体记者黄亚苹实习生盛涛丁欣很意外拍到了大天鹅,也因此获得至尊鸟种奖!2月20日,回忆起昨晚的专家评审现场,观鸟赛新人谭文卓难掩激动之情。因拍摄到极为少见的大天……深入挖掘实体书店的隐藏价值【文化评析】作者:韩浩月(作家)实体书店回暖了,无论是人气还是销售码洋,都证实了这一点。据媒体报道,今年春节期间,北京市有近20万市民逛书店,160多家实体书店的图……GolangWeb框架Iris项目实战JWT和中间件(Mid前文再续,上一回我们完成了用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。本回我们需要为……一口气看完,南明18年历史!一口气看完南明18年历史,公元1644年李自成率军攻破北京城,崇祯帝自杀殉国,自此享国276年的明朝灭亡,其实在南方还有一个小朝廷继续和清军抗衡那就是南明小朝廷。公元16……分享历史五千年中国文学发展史(先秦部分)世界上有四大文明古国,古巴比伦、古印度、古埃及和中国。发展到如今只有中华文明还从未中断,得利于此,中华上下五千年的历史中留下了无数的文学瑰宝,在这系列文章中就带大家回顾中国历史……孔子推崇的周礼怎么会礼崩乐坏当提到春秋战国,礼崩乐坏是躲不掉的话题,而这周礼的崩坏真是春秋战国开始的吗?周朝建立之初,周公(周武王的弟弟)就依照将远古的礼乐进行改造形成周礼,他将人们生活的方方面面都……西游释厄传游戏里,五个人的元神出窍大招谁最实用?《西游释厄传super》中新加入了不少的超必杀技能,包括混元功、乾坤十连斩、吸心大法、升龙斩和元神出窍。这些技能的加入,让这款游戏完全改变了玩法,甚至可以说已经变成了另一……咳嗽,有医生说不能吃肉蛋奶,有的说要多吃才能增强抵抗力,咋整咳嗽,有的说不能吃肉蛋奶,有的说要多吃。碰到这种情况,先要看是谁说的,看没看孩子,确定了孩子咳嗽的原因没有?如果是过敏引起的咳嗽,因为牛羊肉、鸡蛋、牛奶、海鲜引起过敏的可……中国古代十位白手起家的帝王1、刘邦汉高祖刘邦在没有起义之前就是个泼皮无赖,后来当了泗水亭长,走运碰上秦末天下大乱,建立了大汉江山,妥妥的白手起家。汉高祖刘邦2、刘备汉昭烈帝刘备,……元宵节,他们这样过今天,是正月十五元宵节过完今天,年就算过完了传统习俗要看花灯、猜灯谜、吃元宵一家人热热闹闹地在一起尽享团聚的美好时光视频加载中。。。阖家团圆……
如何看待和评价贾平凹落选新一届中国作协副主席?没有背景没有资金个男人成为千万富翁的素质修养做一个懂生活的女人专题文章读创公司调研华宝新能正加快逆变器自研自产欧洲市场需求仍将维持老年人保健老年人便秘怎么办事关全省职工!福建省总工会发布最新通知泰国人我也懂你了这个人让我敬佩杜鹃花好养吗杜鹃花怎么养少浇水注意通风灰质性脊髓炎要接受哪些检查临颍热血男儿李鼎新狙击日寇美名扬化解职场冲突冲突比客套更有必要

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找