generate jwt

This commit is contained in:
yanghao05
2023-02-06 09:12:32 +08:00
parent afeffe2ed6
commit 0ddbeb3f7a
5 changed files with 89 additions and 16 deletions

View File

@@ -1,23 +1,48 @@
package controller package controller
import ( import (
"atom/modules/auth/dto"
"atom/modules/auth/service"
"atom/providers/config" "atom/providers/config"
"atom/providers/jwt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
type UserController interface { type UserController interface {
GetName(*gin.Context) (string, error) Login(*gin.Context, dto.LoginRequestForm) (*dto.LoginResponse, error)
} }
type userControllerImpl struct { type userControllerImpl struct {
conf *config.Config conf *config.Config
user service.UserService
jwt *jwt.JWT
} }
func NewUserController(conf *config.Config) UserController { func NewUserController(
return &userControllerImpl{conf: conf} conf *config.Config,
user service.UserService,
jwt *jwt.JWT,
) UserController {
return &userControllerImpl{
conf: conf,
user: user,
jwt: jwt,
}
} }
func (c *userControllerImpl) GetName(ctx *gin.Context) (string, error) { func (c *userControllerImpl) Login(ctx *gin.Context, req dto.LoginRequestForm) (*dto.LoginResponse, error) {
return "User",nil user, err := c.user.AuthMatchPassword(ctx, &req)
if err != nil {
return nil, err
}
token, err := c.user.GenerateJWTTokenFromUser(ctx, user)
if err != nil {
return nil, err
}
return &dto.LoginResponse{
Token: token,
}, nil
} }

10
modules/auth/dto/user.go Normal file
View File

@@ -0,0 +1,10 @@
package dto
type LoginRequestForm struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
}
type LoginResponse struct {
Token string `json:"token,omitempty"`
}

View File

@@ -13,6 +13,7 @@ import (
type Route struct { type Route struct {
svc *http.Service svc *http.Service
user controller.UserController
role controller.RoleController role controller.RoleController
permission controller.PermissionController permission controller.PermissionController
} }
@@ -20,11 +21,13 @@ type Route struct {
func NewRoute( func NewRoute(
svc *http.Service, svc *http.Service,
role controller.RoleController, role controller.RoleController,
user controller.UserController,
permission controller.PermissionController, permission controller.PermissionController,
) contracts.Route { ) contracts.Route {
return &Route{ return &Route{
svc: svc, svc: svc,
role: role, role: role,
user: user,
permission: permission, permission: permission,
} }
} }
@@ -32,6 +35,12 @@ func NewRoute(
func (r *Route) Register() { func (r *Route) Register() {
group := r.svc.Engine.Group("auth") group := r.svc.Engine.Group("auth")
{ {
// common functions
group.GET("/login", gen.DataFunc1(
r.user.Login,
gen.BindBody(dto.LoginRequestForm{}, err.BindBodyFailed),
))
roleGroup := group.Group("roles") roleGroup := group.Group("roles")
{ {
roleGroup.GET("", gen.DataFunc2( roleGroup.GET("", gen.DataFunc2(

View File

@@ -1,26 +1,34 @@
package service package service
import ( import (
"atom/database/models"
"atom/modules/auth/dao" "atom/modules/auth/dao"
"atom/modules/auth/dto"
"atom/providers/jwt"
"context" "context"
) )
type UserService interface { type UserService interface {
AttachRole(context.Context, int, int) error AttachRole(context.Context, int, int) error
AuthMatchPassword(context.Context, *dto.LoginRequestForm) (*models.User, error)
GenerateJWTTokenFromUser(context.Context, *models.User) (string, error)
} }
type userService struct { type userService struct {
userRoleDao dao.UserRoleDao userRoleDao dao.UserRoleDao
userDao dao.UserDao userDao dao.UserDao
jwt *jwt.JWT
} }
func NewUserService( func NewUserService(
userRoleDao dao.UserRoleDao, userRoleDao dao.UserRoleDao,
userDao dao.UserDao, userDao dao.UserDao,
jwt *jwt.JWT,
) UserService { ) UserService {
return &userService{ return &userService{
userRoleDao: userRoleDao, userRoleDao: userRoleDao,
userDao: userDao, userDao: userDao,
jwt: jwt,
} }
} }
@@ -37,3 +45,24 @@ func (svc *userService) DetachRole(ctx context.Context, userID, roleID int) erro
} }
return svc.userRoleDao.Delete(ctx, userID, roleID) return svc.userRoleDao.Delete(ctx, userID, roleID)
} }
func (svc *userService) AuthMatchPassword(ctx context.Context, req *dto.LoginRequestForm) (*models.User, error) {
return &models.User{
ID: 10,
UUID: "1",
Username: "2",
Password: "3",
Nickname: "4",
Avatar: "5",
RoleID: 66,
}, nil
}
func (svc *userService) GenerateJWTTokenFromUser(ctx context.Context, user *models.User) (string, error) {
return svc.jwt.CreateToken(svc.jwt.CreateClaims(jwt.BaseClaims{
UUID: user.UUID,
UserID: user.ID,
Username: user.Username,
NickName: user.Nickname,
RoleID: user.RoleID,
}))
}

View File

@@ -27,11 +27,11 @@ type CustomClaims struct {
} }
type BaseClaims struct { type BaseClaims struct {
UUID uuid.UUID UUID string
UserID uint UserID uint64
Username string Username string
NickName string NickName string
AuthorityId uint RoleID uint64
} }
type JWT struct { type JWT struct {
@@ -123,7 +123,7 @@ func (j *JWT) GetClaims(c *gin.Context) (*CustomClaims, error) {
} }
// GetUserID 从Gin的Context中获取从jwt解析出来的用户ID // GetUserID 从Gin的Context中获取从jwt解析出来的用户ID
func (j *JWT) GetUserID(c *gin.Context) uint { func (j *JWT) GetUserID(c *gin.Context) uint64 {
if claims, exists := c.Get("claims"); !exists { if claims, exists := c.Get("claims"); !exists {
if cl, err := j.GetClaims(c); err != nil { if cl, err := j.GetClaims(c); err != nil {
return 0 return 0
@@ -137,10 +137,10 @@ func (j *JWT) GetUserID(c *gin.Context) uint {
} }
// GetUserUuid 从Gin的Context中获取从jwt解析出来的用户UUID // GetUserUuid 从Gin的Context中获取从jwt解析出来的用户UUID
func (j *JWT) GetUserUuid(c *gin.Context) uuid.UUID { func (j *JWT) GetUserUuid(c *gin.Context) string {
if claims, exists := c.Get("claims"); !exists { if claims, exists := c.Get("claims"); !exists {
if cl, err := j.GetClaims(c); err != nil { if cl, err := j.GetClaims(c); err != nil {
return uuid.UUID{} return uuid.UUID{}.String()
} else { } else {
return cl.UUID return cl.UUID
} }
@@ -151,16 +151,16 @@ func (j *JWT) GetUserUuid(c *gin.Context) uuid.UUID {
} }
// GetUserAuthorityId 从Gin的Context中获取从jwt解析出来的用户角色id // GetUserAuthorityId 从Gin的Context中获取从jwt解析出来的用户角色id
func (j *JWT) GetUserAuthorityId(c *gin.Context) uint { func (j *JWT) GetRoleId(c *gin.Context) uint64 {
if claims, exists := c.Get("claims"); !exists { if claims, exists := c.Get("claims"); !exists {
if cl, err := j.GetClaims(c); err != nil { if cl, err := j.GetClaims(c); err != nil {
return 0 return 0
} else { } else {
return cl.AuthorityId return cl.RoleID
} }
} else { } else {
waitUse := claims.(*CustomClaims) waitUse := claims.(*CustomClaims)
return waitUse.AuthorityId return waitUse.RoleID
} }
} }