✨ add casbin permission verification middleware
This commit is contained in:
@@ -38,7 +38,7 @@ func (UserAPI) GetUserList(c *gin.Context) {
|
|||||||
// @Router /api/auth/user/query_by_username [get]
|
// @Router /api/auth/user/query_by_username [get]
|
||||||
func (UserAPI) QueryUserByUsername(c *gin.Context) {
|
func (UserAPI) QueryUserByUsername(c *gin.Context) {
|
||||||
username := c.Query("username")
|
username := c.Query("username")
|
||||||
user, _ := userService.QueryUserByUsername(username)
|
user := userService.QueryUserByUsername(username)
|
||||||
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "NotFoundUser"), c)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "NotFoundUser"), c)
|
||||||
return
|
return
|
||||||
@@ -112,7 +112,7 @@ func (UserAPI) AddUser(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
username, _ := userService.QueryUserByUsername(addUserRequest.Username)
|
username := userService.QueryUserByUsername(addUserRequest.Username)
|
||||||
if !reflect.DeepEqual(username, model.ScaAuthUser{}) {
|
if !reflect.DeepEqual(username, model.ScaAuthUser{}) {
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "UsernameExists"), c)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "UsernameExists"), c)
|
||||||
return
|
return
|
||||||
@@ -169,59 +169,29 @@ func (UserAPI) AccountLogin(c *gin.Context) {
|
|||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "AccountAndPasswordNotEmpty"), c)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "AccountAndPasswordNotEmpty"), c)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
isPhone := utils.IsPhone(account)
|
|
||||||
if isPhone {
|
var user model.ScaAuthUser
|
||||||
user := userService.QueryUserByPhone(account)
|
if utils.IsPhone(account) {
|
||||||
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
user = userService.QueryUserByPhone(account)
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "PhoneNotRegister"), c)
|
} else if utils.IsEmail(account) {
|
||||||
return
|
user = userService.QueryUserByEmail(account)
|
||||||
} else {
|
} else if utils.IsUsername(account) {
|
||||||
verify := utils.Verify(*user.Password, password)
|
user = userService.QueryUserByUsername(account)
|
||||||
if verify {
|
} else {
|
||||||
handelUserLogin(user, accountLoginRequest.AutoLogin, c)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "AccountErrorFormat"), c)
|
||||||
return
|
return
|
||||||
} else {
|
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "PasswordError"), c)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
isEmail := utils.IsEmail(account)
|
|
||||||
if isEmail {
|
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
||||||
user := userService.QueryUserByEmail(account)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "NotFoundUser"), c)
|
||||||
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
return
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "EmailNotRegister"), c)
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
verify := utils.Verify(*user.Password, password)
|
|
||||||
if verify {
|
|
||||||
handelUserLogin(user, accountLoginRequest.AutoLogin, c)
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "PasswordError"), c)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
isUsername := utils.IsUsername(account)
|
|
||||||
if isUsername {
|
if !utils.Verify(*user.Password, password) {
|
||||||
user, _ := userService.QueryUserByUsername(account)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "PasswordError"), c)
|
||||||
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
return
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "UsernameNotRegister"), c)
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
verify := utils.Verify(*user.Password, password)
|
|
||||||
if verify {
|
|
||||||
handelUserLogin(user, accountLoginRequest.AutoLogin, c)
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "PasswordError"), c)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "AccountErrorFormat"), c)
|
handelUserLogin(user, accountLoginRequest.AutoLogin, c)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PhoneLogin 手机号登录/注册
|
// PhoneLogin 手机号登录/注册
|
||||||
@@ -320,8 +290,7 @@ func (UserAPI) PhoneLogin(c *gin.Context) {
|
|||||||
// @Router /api/token/refresh [post]
|
// @Router /api/token/refresh [post]
|
||||||
func (UserAPI) RefreshHandler(c *gin.Context) {
|
func (UserAPI) RefreshHandler(c *gin.Context) {
|
||||||
request := dto.RefreshTokenRequest{}
|
request := dto.RefreshTokenRequest{}
|
||||||
err := c.ShouldBindJSON(&request)
|
if err := c.ShouldBindJSON(&request); err != nil {
|
||||||
if err != nil {
|
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "ParamsError"), c)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "ParamsError"), c)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -336,32 +305,32 @@ func (UserAPI) RefreshHandler(c *gin.Context) {
|
|||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "LoginExpired"), c)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "LoginExpired"), c)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if isUpd {
|
if !isUpd {
|
||||||
accessTokenString, err := utils.GenerateAccessToken(utils.AccessJWTPayload{UserID: parseRefreshToken.UserID})
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "LoginExpired"), c)
|
||||||
if err != nil {
|
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "LoginExpired"), c)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
token, err := redis.Get(constant.UserLoginTokenRedisKey + *parseRefreshToken.UserID).Result()
|
|
||||||
if token == "" || err != nil {
|
|
||||||
global.LOG.Errorln(err)
|
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "LoginExpired"), c)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
data := dto.ResponseData{
|
|
||||||
AccessToken: accessTokenString,
|
|
||||||
RefreshToken: refreshToken,
|
|
||||||
UID: parseRefreshToken.UserID,
|
|
||||||
}
|
|
||||||
fail := redis.Set("user:login:token:"+*parseRefreshToken.UserID, data, time.Hour*24*7).Err()
|
|
||||||
if fail != nil {
|
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "LoginExpired"), c)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
result.OkWithData(data, c)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
accessTokenString, err := utils.GenerateAccessToken(utils.AccessJWTPayload{UserID: parseRefreshToken.UserID})
|
||||||
|
if err != nil {
|
||||||
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "LoginExpired"), c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tokenKey := constant.UserLoginTokenRedisKey + *parseRefreshToken.UserID
|
||||||
|
token, err := redis.Get(tokenKey).Result()
|
||||||
|
if token == "" || err != nil {
|
||||||
|
global.LOG.Errorln(err)
|
||||||
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "LoginExpired"), c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data := dto.ResponseData{
|
||||||
|
AccessToken: accessTokenString,
|
||||||
|
RefreshToken: refreshToken,
|
||||||
|
UID: parseRefreshToken.UserID,
|
||||||
|
}
|
||||||
|
if err := redis.Set(tokenKey, data, time.Hour*24*7).Err(); err != nil {
|
||||||
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "LoginExpired"), c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
result.OkWithData(data, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// handelUserLogin 处理用户登录
|
// handelUserLogin 处理用户登录
|
||||||
|
30
middleware/casbin.go
Normal file
30
middleware/casbin.go
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"schisandra-cloud-album/global"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CasbinMiddleware() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
userId, ok := c.Get("userId")
|
||||||
|
if !ok {
|
||||||
|
global.LOG.Error("casbin middleware: userId not found")
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
method := c.Request.Method
|
||||||
|
path := c.Request.URL.Path
|
||||||
|
ok, err := global.Casbin.Enforce(userId.(string), path, method)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error("casbin middleware: ", err)
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Next()
|
||||||
|
}
|
||||||
|
}
|
@@ -17,7 +17,7 @@ func UserRouter(router *gin.RouterGroup) {
|
|||||||
userGroup.POST("/add", userApi.AddUser)
|
userGroup.POST("/add", userApi.AddUser)
|
||||||
userGroup.POST("/reset_password", userApi.ResetPassword)
|
userGroup.POST("/reset_password", userApi.ResetPassword)
|
||||||
}
|
}
|
||||||
authGroup := router.Group("auth").Use(middleware.JWTAuthMiddleware())
|
authGroup := router.Group("auth").Use(middleware.JWTAuthMiddleware()).Use(middleware.CasbinMiddleware())
|
||||||
{
|
{
|
||||||
authGroup.GET("/user/list", userApi.GetUserList)
|
authGroup.GET("/user/list", userApi.GetUserList)
|
||||||
authGroup.GET("/user/query_by_uuid", userApi.QueryUserByUuid)
|
authGroup.GET("/user/query_by_uuid", userApi.QueryUserByUuid)
|
||||||
|
@@ -14,13 +14,13 @@ func (UserService) GetUserList() []*model.ScaAuthUser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// QueryUserByUsername 根据用户名查询用户
|
// QueryUserByUsername 根据用户名查询用户
|
||||||
func (UserService) QueryUserByUsername(username string) (model.ScaAuthUser, error) {
|
func (UserService) QueryUserByUsername(username string) model.ScaAuthUser {
|
||||||
authUser := model.ScaAuthUser{}
|
authUser := model.ScaAuthUser{}
|
||||||
err := global.DB.Where("username = ? and deleted = 0", username).First(&authUser).Error
|
err := global.DB.Where("username = ? and deleted = 0", username).First(&authUser).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return model.ScaAuthUser{}, err
|
return model.ScaAuthUser{}
|
||||||
}
|
}
|
||||||
return authUser, nil
|
return authUser
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryUserByUuid 根据用户uuid查询用户
|
// QueryUserByUuid 根据用户uuid查询用户
|
||||||
|
Reference in New Issue
Block a user