generate jwt
This commit is contained in:
@@ -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
10
modules/auth/dto/user.go
Normal 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"`
|
||||||
|
}
|
||||||
@@ -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(
|
||||||
|
|||||||
@@ -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,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user