redis token

This commit is contained in:
zp
2024-01-15 17:30:07 +08:00
parent 00122cc66d
commit cb8ca55aba
28 changed files with 931 additions and 31 deletions

View File

@ -2,12 +2,23 @@ package cmd
import (
"context"
"strconv"
"github.com/goflyfox/gtoken/gtoken"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gcmd"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
apiBackend "novel/api/backend"
"novel/internal/consts"
"novel/internal/controller/backend"
"novel/internal/dao"
"novel/internal/model"
"novel/internal/model/entity"
"novel/internal/service"
"novel/utility/response"
)
var (
@ -18,6 +29,22 @@ var (
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
// 认证接口
// loginFunc := Login
// 启动
gfToken := &gtoken.GfToken{
CacheMode: consts.CacheModeRedis,
ServerName: "novel",
LoginPath: "/create-or-login",
LoginBeforeFunc: loginFunc,
LoginAfterFunc: loginAfterFunc,
LogoutPath: "/backend/logout",
AuthPaths: g.SliceStr{"/backend/admin/info"},
AuthExcludePaths: g.SliceStr{"/admin/user/info", "/admin/system/user/info"}, // 不拦截路径 /user/info,/system/user/info,/system/user,
AuthAfterFunc: authAfterFunc,
MultiLogin: true,
}
// s.Group("/backend", func(group *ghttp.RouterGroup) {
// group.Middleware(ghttp.MiddlewareHandlerResponse)
// group.Group("/writer", func(group2 *ghttp.RouterGroup) {
@ -27,24 +54,33 @@ var (
// 管理后台路由组
s.Group("/backend", func(group *ghttp.RouterGroup) {
group.Middleware(ghttp.MiddlewareHandlerResponse)
// group.Middleware(
// service.Middleware().CORS,
// service.Middleware().Ctx,
// service.Middleware().ResponseHandler,
// )
// // gtoken中间件绑定
// err := gfToken.Middleware(ctx, group)
// if nil != nil {
// panic(err)
// }
// 不需要登录的路由组绑定
// group.Bind(
// controller.Admin.Create, // 管理员
// controller.Login, // 登录
// )
group.Bind(
// backend.Login, // 登录相关
backend.Login.GetPhoneCode, // 验证码
backend.Login.CreateOrLogin, // 登录
)
// 需要登录的路由组绑定
group.Group("/", func(group *ghttp.RouterGroup) {
// err := gfAdminToken.Middleware(ctx, group)
err := gfToken.Middleware(ctx, group)
if err != nil {
panic(err)
}
group.Bind(
backend.Login, // 数据大屏相关
backend.Writer.Info, // 查询当前管理员信息
)
})
})
@ -54,3 +90,87 @@ var (
},
}
)
func loginFunc(r *ghttp.Request) (string, interface{}) {
phone := r.Get("phone").String()
code := r.Get("code").Int()
if phone == "" || code <= 0 {
r.Response.WriteJson(gtoken.Fail("手机号或者验证码不能为空"))
r.ExitAll()
}
ctx := context.TODO()
writer, err := service.Writer().CreateOrLogin(ctx, model.WriterCreateOrLoginInput{
Phone: phone,
Code: code,
})
if err != nil {
r.Response.WriteJson(gtoken.Fail("手机号或者验证码错误"))
r.ExitAll()
}
return consts.GtokenWriterPrefix + strconv.Itoa(int(writer.Id)), writer
}
// 自定义的登录之后的函数
func loginAfterFunc(r *ghttp.Request, respData gtoken.Resp) {
if !respData.Success() {
respData.Code = 0
r.Response.WriteJson(respData)
return
} else {
respData.Code = 1
// 获得登录用户id
userKey := respData.GetString("userKey")
adminId := gstr.StrEx(userKey, consts.GtokenWriterPrefix)
// 根据id获得登录用户其他信息
writerInfo := entity.Writer{}
err := dao.Writer.Ctx(context.TODO()).WherePri(adminId).Scan(&writerInfo)
if err != nil {
return
}
// 通过角色查询权限
// 先通过角色查询权限id
var rolePermissionInfos []entity.RolePermissionInfo
err = dao.RolePermissionInfo.Ctx(context.TODO()).WhereIn(dao.RolePermissionInfo.Columns().RoleId, g.Slice{writerInfo.RoleIds}).Scan(&rolePermissionInfos)
if err != nil {
return
}
permissionIds := g.Slice{}
for _, info := range rolePermissionInfos {
permissionIds = append(permissionIds, info.PermissionId)
}
var permissions []entity.PermissionInfo
err = dao.PermissionInfo.Ctx(context.TODO()).WhereIn(dao.PermissionInfo.Columns().Id, permissionIds).Scan(&permissions)
if err != nil {
return
}
data := &apiBackend.CreateOrLoginRes{
Type: consts.TokenType,
Token: respData.GetString("token"),
ExpireIn: consts.GTokenExpireIn, // 单位秒,
IsAdmin: writerInfo.IsAdmin,
RoleIds: writerInfo.RoleIds,
Permissions: permissions,
}
response.JsonExit(r, 0, "", data)
}
return
}
// 登录鉴权中间件for后台
func authAfterFunc(r *ghttp.Request, respData gtoken.Resp) {
var writerInfo entity.Writer
err := gconv.Struct(respData.GetString("data"), &writerInfo)
if err != nil {
response.Auth(r)
return
}
// todo 这里可以写账号前置校验、是否被拉黑、有无权限等逻辑
r.SetCtxVar(consts.CtxWriterId, writerInfo.Id)
r.SetCtxVar(consts.CtxWriterName, writerInfo.PenName)
r.SetCtxVar(consts.CtxWriterIsAdmin, writerInfo.IsAdmin)
r.SetCtxVar(consts.CtxWriterRoleIds, writerInfo.RoleIds)
r.Middleware.Next()
}