继续上周的部分开始写起
圖中先对学号进行md5加密:调用utils包中的方法时,传入的参数是string,所以先对int类型的Id转为string,然后进行加密
这时候去缓存调用方法判断redis中是否存在key为加密后的学号
如果存在,则将其序列化然后取出,
这个函数大体同上,主要调用
接受一个空接口类型数据,返回一个byte类型切片。
回到最上面,这时候声明下面这个结构体
通过json.Unmarshal方法解码json格式的数据,即:将[]byte类型的数据转为UserData结构体类型的数据。
如果成功则返回下图所示的结构体作为data返回给前端。
如果用户是第一次登陆,则调用下面的方法
该方法的作用就是:从数据库中获取用户常用信息并返回,在其中有一个方法比较重要:
生成token:
在这个函数中,初始化了下面的这个结构体
使用 jwt.NewWithClaims方传入指定算法和载荷内容,得到指针类型的token然后调用SignedString方法得到字符串token并将其返回给前端
接下来就是使用sqlx到数据库查询数据,将查询到的数据存到传入的第一个参数里。
调用下面的ToRedis方法:key是经过md5加密后的id
最后返回的是一个实例化后的结构体对象,该结构体只有一个属性。
登录接口就写完了,接下来看后端环境中一些前面没有写到但是还需要注意的地方 —— 错误处理
先看code文件:
里面都是这种变量,所以整体被var()包括着。&表示的是取地址。
接下来就是第二个文件errno:
这两个函数联合使用,判断是哪一种错误类型,针对不同类型返回不同数据:具体理解可以参考下面的例子。
接下来是工具包中的md5加密以及对密码进行md5加密然后与从数据库中取出的加密后的md5进行判断
然后是读取excel表格方法:
-
第一步: 声明一个结构体
-
第二步:使用地址存储需要从哪儿读取excel文件
-
第三步:读取其实极为简单主要分两部分。先读取地址,获取到之后,逐行便利,第一行排除。
- 对每一行每一列进行判断
固定的数据写在后面
每读取一行就开启一个goroutine来朝数据库存值。
上传文件方法
c.Request.FormFile()方法在圖中有注释,然后根据“.”对header.Filename进行分割,获取到上传文件的后缀。文件名则是根据uuid生成一个通用唯一标识码。UUID出现的目的,是为了让分布式系统可以不借助中心节点,就可以生成UUID来标识一些唯一的信息
创建一个文件,制定好路径和文件名字及后缀。
最后defer文件的Close方法即:使其不能用于I/O
> 将用户上传的文件copy到新创建的文件中,返回地址给前端。
对响应数据进行封装
封装也是主要体现在少写代码上。
還有一點需要注意:
- c.GET获取提前存到context中的数据,取出后需要对其进行断言,才能使用。第二行便是断言的格式。
- 断言的位置是在进行jwt中间件认证时成功之后把有关用户的相关信息放到了context中。
- 如下:
首先它返回的是一个方法:
从请求头中获取key为Authorization对应的value
分几种情况:
①如果为空,则返回;其中c.Abort()常常与return结合使用,表示的意思是:这次请求就到这里了,顺着return返回出去。
②如果有内容,则对其进行分割,但是如果分割之后的内容不符合条件则返回错误
③成功则开始解析token,调用下面的方法:
解析token主要使用jwt.ParseWithClaims方法,传入token,以及token对应的结构体。一句话就是:生成token与解析token是一一对应的,返回的是token类型的指针和一个错误
对其进行验证:是否存在以及时间是否还在有效期内,如果都符合条件则进行下一步:
对其进行md5加密返回加密后的string,加密时:
将学号加盐密然后转为[]byte类型之后进行md5加密
之后
对其调用redis操作获取对应的userData
这时候对其进行断言
将从redis中取出的userData断言为authDao.userData类型的结构体数据,并将其存入到上下文中,这时候调用c.Next()使请求转入下一个中间件。
基于casbin的权限认证系统
考虑到不同人在不同社团有着不同角色实现着不同权限,所以加入域在其中
使用配置文件存储策略
使用中间件对用户请求进行判断
返回的是一个方法:
先获取请求的uri,然后获取请求方法,然后从context中取出用户基本信息并对其进行断言。
如果这步失败就让用户重新登录。
目的在于获取用户id
获取域
对其分成两类,一是get请求,加入默认值,其他请求则通过Param的方法来获取数据
去数据库查找政策。如果成功,则挂起继续向下执行,反之返回错误。
这段代码的作用主要是加载适合特定数据库的适配器,以及与数据库建立连接并且加载相关规则。