79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
package service
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
"mc-client-updater-server/pkg/dao"
|
|
"mc-client-updater-server/pkg/dao/entity"
|
|
"mc-client-updater-server/pkg/password"
|
|
"mc-client-updater-server/pkg/result"
|
|
"mc-client-updater-server/pkg/token"
|
|
"mc-client-updater-server/pkg/util"
|
|
"strings"
|
|
)
|
|
|
|
type UserService struct {
|
|
ctx *gin.Context
|
|
}
|
|
|
|
func NewUserService(c *gin.Context) *UserService {
|
|
return &UserService{ctx: c}
|
|
}
|
|
|
|
func (s *UserService) Login(username, pwd string) {
|
|
res := result.NewResult(s.ctx)
|
|
|
|
user := entity.User{Username: username}
|
|
tx := dao.DB().First(&user)
|
|
if tx.Error != nil {
|
|
switch tx.Error {
|
|
case gorm.ErrRecordNotFound:
|
|
res.LoginError()
|
|
return
|
|
default:
|
|
res.LoginError()
|
|
return
|
|
}
|
|
}
|
|
|
|
// 验证密码
|
|
ok, err := password.Password().Verify(pwd, user.Password)
|
|
if err != nil || !ok {
|
|
res.LoginError()
|
|
return
|
|
}
|
|
|
|
tokenStr := token.NewToken(user.Username)
|
|
tokenResult := &entity.Token{
|
|
Token: tokenStr,
|
|
GrantTo: user.Username,
|
|
TTL: 86400,
|
|
}
|
|
tokenSrv := NewTokenService(s.ctx)
|
|
err = tokenSrv.AddToken(tokenResult)
|
|
if err != nil {
|
|
res.InternalServerError("创建登录记录时发生意外错误")
|
|
return
|
|
}
|
|
res.Success(tokenResult)
|
|
}
|
|
|
|
func (s *UserService) hasRole(role string, user *entity.User) bool {
|
|
roles := strings.Split(user.Roles, ",")
|
|
return util.InStringSlice(roles, role)
|
|
}
|
|
|
|
func (s *UserService) getUserByUsername(name string) *entity.User {
|
|
user := entity.User{Username: name}
|
|
tx := dao.DB().First(&user)
|
|
if tx.Error != nil {
|
|
return nil
|
|
}
|
|
return &user
|
|
}
|
|
|
|
func (s *UserService) JudgeRoleByToken(role string, token *entity.Token) bool {
|
|
user := s.getUserByUsername(token.GrantTo)
|
|
return s.hasRole(role, user)
|
|
}
|