✨ 授权设备
This commit is contained in:
@@ -42,3 +42,25 @@ type CpUserUpdatePasswordReq struct {
|
||||
Id int64 `json:"id"`
|
||||
NewPassword string `json:"newPassword"`
|
||||
}
|
||||
|
||||
type CpUserAuthorizeDeviceReq struct {
|
||||
g.Meta `path:"/user/authorizeDevice" method:"post" tags:"CpUser" summary:"授权设备"`
|
||||
Id int64 `json:"id"`
|
||||
}
|
||||
|
||||
type CpUserAuthorizeSuccessReq struct {
|
||||
g.Meta `path:"/user/authorizeSuccess" method:"post" tags:"CpUser" summary:"授权成功" auth:"false"`
|
||||
DataKey string `json:"dataKey"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
type CpUserAuthorizeConfirmReq struct {
|
||||
g.Meta `path:"/user/authorizeConfirm" method:"post" tags:"CpUser" summary:"授权确认"`
|
||||
Id int64 `json:"id"`
|
||||
DataKey string `json:"dataKey"`
|
||||
}
|
||||
|
||||
type CpUserAuthorizeRandomReq struct {
|
||||
g.Meta `path:"/user/authorizeRandom" method:"post" tags:"CpUser" summary:"随机设备码"`
|
||||
Id int64 `json:"id"`
|
||||
}
|
||||
|
||||
@@ -43,3 +43,21 @@ func (c CpUserCtrlV1) SchoolList(ctx context.Context, req *v1.CpSchoolListReq) (
|
||||
defer utils.Pass(&err)
|
||||
return service.Global.CpUser.SchoolList(ctx, req), nil
|
||||
}
|
||||
func (c CpUserCtrlV1) AuthorizeDevice(ctx context.Context, req *v1.CpUserAuthorizeDeviceReq) (res *utils.Response[any], err error) {
|
||||
defer utils.Pass(&err)
|
||||
return service.Global.CpUser.AuthorizeDevice(ctx, req), nil
|
||||
}
|
||||
|
||||
func (c CpUserCtrlV1) AuthorizeDeviceSuccess(ctx context.Context, req *v1.CpUserAuthorizeSuccessReq) (res *utils.Response[any], err error) {
|
||||
defer utils.Pass(&err)
|
||||
return service.Global.CpUser.AuthorizeDeviceSuccess(ctx, req), nil
|
||||
}
|
||||
func (c CpUserCtrlV1) AuthorizeConfirm(ctx context.Context, req *v1.CpUserAuthorizeConfirmReq) (res *utils.Response[any], err error) {
|
||||
defer utils.Pass(&err)
|
||||
return service.Global.CpUser.AuthorizeConfirm(ctx, req), nil
|
||||
}
|
||||
|
||||
func (c CpUserCtrlV1) AuthorizeRandom(ctx context.Context, req *v1.CpUserAuthorizeRandomReq) (res *utils.Response[any], err error) {
|
||||
defer utils.Pass(&err)
|
||||
return service.Global.CpUser.AuthorizeRandom(ctx, req), nil
|
||||
}
|
||||
|
||||
@@ -19,6 +19,10 @@ type ICpUserCtrlV1 interface {
|
||||
Delete(ctx context.Context, req *v1.CpUserDeleteReq) (*utils.Response[any], error)
|
||||
// 修改密码
|
||||
UpdatePassword(ctx context.Context, req *v1.CpUserUpdatePasswordReq) (*utils.Response[any], error)
|
||||
// todo 授权设备
|
||||
//AuthorizeDevice(ctx context.Context, req *v1.CpUserAuthorizeDeviceReq) (*utils.Response[any], error)
|
||||
// 授权设备
|
||||
AuthorizeDevice(ctx context.Context, req *v1.CpUserAuthorizeDeviceReq) (*utils.Response[any], error)
|
||||
// 验证授权是否成功
|
||||
AuthorizeConfirm(ctx context.Context, req *v1.CpUserAuthorizeConfirmReq) (*utils.Response[any], error)
|
||||
// 随机授权
|
||||
AuthorizeRandom(ctx context.Context, req *v1.CpUserAuthorizeRandomReq) (res *utils.Response[any], err error)
|
||||
}
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
package cst
|
||||
|
||||
const (
|
||||
RedisUserInfo = "userinfo:"
|
||||
RedisVerifyCode = "verifycode:"
|
||||
RedisCpUserLogin = "cpuserlogin:"
|
||||
RedisUserInfo = "userinfo:"
|
||||
RedisVerifyCode = "verifycode:"
|
||||
RedisCpUserLogin = "cpuserlogin:"
|
||||
RedisCpUserAuthorize = "cpuser:authorize:"
|
||||
)
|
||||
|
||||
var (
|
||||
RedisUserInfoExpire = int64(86400)
|
||||
RedisVerifyCodeExpire = int64(86400)
|
||||
RedisCpUserLoginExpire = int64(180)
|
||||
RedisUserInfoExpire = int64(86400)
|
||||
RedisVerifyCodeExpire = int64(86400)
|
||||
RedisCpUserLoginExpire = int64(180)
|
||||
RedisCpUserAuthorizeExpire = int64(1800)
|
||||
)
|
||||
|
||||
@@ -163,7 +163,9 @@ func (ts *TaskScanner) scanCpdailyTask() {
|
||||
}
|
||||
})
|
||||
|
||||
g.Log().Warningf(ts.ctx, "以下任务ID已过期,重置了下次执行时间: %v", strings.Join(expiredIDs, ", "))
|
||||
if len(expiredIDs) > 0 {
|
||||
g.Log().Warningf(ts.ctx, "以下任务ID已过期,重置了下次执行时间: %v", strings.Join(expiredIDs, ", "))
|
||||
}
|
||||
|
||||
for _, task := range expiredTasks {
|
||||
nextExecuteAt := utils.GetCpdailyNextExecuteTime(task)
|
||||
|
||||
@@ -18,6 +18,16 @@ import (
|
||||
)
|
||||
|
||||
func AuthHandler(r *ghttp.Request) {
|
||||
handler := r.GetServeHandler()
|
||||
if !utils.IsController(handler) {
|
||||
r.Middleware.Next()
|
||||
return
|
||||
}
|
||||
authTag := handler.GetMetaTag("auth")
|
||||
if authTag == "false" {
|
||||
r.Middleware.Next()
|
||||
return
|
||||
}
|
||||
token := r.Request.Header.Get(cst.AuthorizationKey)
|
||||
if token == "" || !strings.HasPrefix(token, "Bearer ") {
|
||||
r.Response.ClearBuffer()
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"github.com/gogf/gf/v2/net/ghttp"
|
||||
"likedream-goframe/internal/cst"
|
||||
"likedream-goframe/internal/utils"
|
||||
|
||||
"github.com/gogf/gf/v2/net/ghttp"
|
||||
)
|
||||
|
||||
func PermissionHandler(r *ghttp.Request) {
|
||||
@@ -17,6 +18,11 @@ func PermissionHandler(r *ghttp.Request) {
|
||||
r.Middleware.Next()
|
||||
return
|
||||
}
|
||||
authTag := handler.GetMetaTag("auth")
|
||||
if authTag == "false" {
|
||||
r.Middleware.Next()
|
||||
return
|
||||
}
|
||||
value := r.GetCtx().Value(cst.CtxPermissionList)
|
||||
permissionList := value.([]string)
|
||||
if utils.IsAdmin(permissionList) {
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
v1 "likedream-goframe/internal/api/v1"
|
||||
"likedream-goframe/internal/application/cpdaily/login"
|
||||
"likedream-goframe/internal/application/cpdaily/school"
|
||||
"likedream-goframe/internal/cst"
|
||||
"likedream-goframe/internal/db"
|
||||
"likedream-goframe/internal/ent"
|
||||
"likedream-goframe/internal/ent/cpschool"
|
||||
@@ -13,6 +14,8 @@ import (
|
||||
"likedream-goframe/internal/ent/sysuser"
|
||||
"likedream-goframe/internal/framework/redis"
|
||||
"likedream-goframe/internal/utils"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/samber/oops"
|
||||
)
|
||||
@@ -120,3 +123,51 @@ func (v CpUserServiceV1) SchoolList(ctx context.Context, req *v1.CpSchoolListReq
|
||||
schoolList := db.Global.CpSchool.Query().Where(cpschool.NameContains(req.Name)).Limit(5).AllX(ctx)
|
||||
return utils.SuccessWithData(schoolList)
|
||||
}
|
||||
|
||||
func (v CpUserServiceV1) AuthorizeDevice(ctx context.Context, req *v1.CpUserAuthorizeDeviceReq) *utils.Response[any] {
|
||||
user := utils.GetUserInfoFromCtx(ctx)
|
||||
cpUser := db.Global.CpUser.Query().Where(cpuser.ID(req.Id), cpuser.HasSysuserWith(sysuser.ID(user.ID))).FirstX(ctx)
|
||||
if cpUser == nil {
|
||||
return utils.FailParam("用户不存在")
|
||||
}
|
||||
client := redis.GetClient()
|
||||
dataKey := utils.UUID()
|
||||
client.Set(ctx, cst.RedisCpUserAuthorize+dataKey, cpUser.ID, time.Duration(cst.RedisCpUserAuthorizeExpire)*time.Second)
|
||||
return utils.SuccessWithData[any](map[string]string{
|
||||
"dataKey": dataKey,
|
||||
})
|
||||
}
|
||||
|
||||
func (v CpUserServiceV1) AuthorizeDeviceSuccess(ctx context.Context, req *v1.CpUserAuthorizeSuccessReq) *utils.Response[any] {
|
||||
cpUserId := redis.GetClient().Get(ctx, cst.RedisCpUserAuthorize+req.DataKey).Val()
|
||||
if cpUserId == "" {
|
||||
return utils.Fail(400, "缓存过期,请重新扫码授权!")
|
||||
}
|
||||
id, _ := strconv.ParseInt(cpUserId, 10, 64)
|
||||
db.Global.CpUser.UpdateOneID(id).SetMobileCode(req.Data).SetMobileType(cpuser.MobileTypeAuthorize).ExecX(ctx)
|
||||
redis.GetClient().Del(ctx, cst.RedisCpUserAuthorize+req.DataKey)
|
||||
return utils.SuccessWithMsg("授权成功")
|
||||
}
|
||||
|
||||
func (v CpUserServiceV1) AuthorizeConfirm(ctx context.Context, req *v1.CpUserAuthorizeConfirmReq) *utils.Response[any] {
|
||||
user := utils.GetUserInfoFromCtx(ctx)
|
||||
cpUser := db.Global.CpUser.Query().Where(cpuser.ID(req.Id), cpuser.HasSysuserWith(sysuser.ID(user.ID))).FirstX(ctx)
|
||||
if cpUser == nil {
|
||||
return utils.FailParam("用户不存在")
|
||||
}
|
||||
val := redis.GetClient().Exists(ctx, cst.RedisCpUserAuthorize+req.DataKey).Val()
|
||||
if val != 0 || cpUser.MobileType == cpuser.MobileTypeRandom {
|
||||
return utils.Fail(400, "暂未授权")
|
||||
}
|
||||
return utils.SuccessWithMsg("已确认授权")
|
||||
}
|
||||
|
||||
func (v CpUserServiceV1) AuthorizeRandom(ctx context.Context, req *v1.CpUserAuthorizeRandomReq) *utils.Response[any] {
|
||||
user := utils.GetUserInfoFromCtx(ctx)
|
||||
cpUser := db.Global.CpUser.Query().Where(cpuser.ID(req.Id), cpuser.HasSysuserWith(sysuser.ID(user.ID))).FirstX(ctx)
|
||||
if cpUser == nil {
|
||||
return utils.FailParam("用户不存在")
|
||||
}
|
||||
db.Global.CpUser.UpdateOne(cpUser).SetMobileCode(utils.UUID()).SetMobileType(cpuser.MobileTypeRandom).ExecX(ctx)
|
||||
return utils.SuccessWithMsg("已改为随机设备码")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user