「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战」
前言
前面把后台功能完成了,今天准备把后端关于登录的接口写出来。
新建模型
需要做一个简单的后台用户表,做一个最简单的功能,用户名,密码,后台显示的头像。然后需要一个token字段,一般token存放在redis里面,为了简单易用,我准备直接放在后台用户表里面,然后设置一个过期时间。
在model.go里面加上ORM映射的结构体,在自动迁移的代码里加上这个结构体
1 | go复制代码type AdminUser struct { |
1 | less复制代码db.AutoMigrate(&UrlList{}, &UrlType{}, &AdminUser{}) //自动迁移 |
启动项目自动会在数据库创建数据表,然后新建数据
新建中间件方法
在需要中间件验证的地方使用这个Token
中间件。每次经过中间件的时候查询admin_user
这张表是否存在这个token,且没有过期。然后把token携带的内容设置到上下文提供给某些接口使用。这里需要注意中间件的拦截需要使用c.about()
方法不能只用return。不然还是会继续走路由方法会有两个return。
1 | go复制代码import |
新建修改路由,使用中间件
主要有三个方法login
,info
,logout
三个方法都不需要走token中间件,info
和logout
和都是从get方法的param中获取token。login用于传递用户名密码就不需要中间件,涉及到的路由代码如下:
1 | css复制代码 admin := router.Group("/admin") |
新建控制器
控制器获取服务方法的内容判断,还有获取中间件设置的上下文的内容交给服务方法,处理错误,规范返回
1 | go复制代码func Login(c *gin.Context) { |
验证器
验证器的内容很少,主要是登录必须要字符串的用户名密码
1 | c复制代码type LoginRequest struct { |
服务方法
文件位置是service/service.go
,今天逻辑最重要的地方,主要是登录,自己做了一些注释,判断有没有token,token过期时间,根据这些判断进行生成随机token或者直接返回操作,这里还引入了一些新的包,专门存放自己写的公共方法,util
包:
1 | scss复制代码func Login(json request.LoginRequest) (data string, err error) { |
公共方法
主要是生成随机的32未字符串,MD5混淆,在根目录下新建util/util.go文件,引入了两个内置包,一个是用于随机的包,和时间处理的包,这里就可以看到goalng的简陋了,随机竟然还需要获取时间来做一个随机种子来做成真正的随机;MD5混淆主要是用于密码保存,总所周知密码原文直接存放在数据库是非常不安全的,以下是整个文件内容:
1 | go复制代码package util |
模型方法
对于GORM操作不是很熟悉,用了很多方法实现了各种需求,获取用户信息,创建token,删除token。
1 | go复制代码func Login(name string, password string) (list []AdminUser, err error) { |
总结
主要登录逻辑最为复杂,对于简单的内容系统,一般是直接在数据库添加数据,不做账户注册,我们公司后台就是。先需要把密码混淆后对数据库对比,有了就登录成功了,成功之前还需要更新token给前端使用,还需要动态更新设置token的到期时间。代码比较多,下篇更新前端关于的设置。
本文转载自: 掘金