76 lines
2.1 KiB
Go
76 lines
2.1 KiB
Go
package middleware
|
||
|
||
import (
|
||
"github.com/goravel/framework/contracts/http"
|
||
"github.com/goravel/framework/facades"
|
||
"github.com/goravel/framework/support/str"
|
||
|
||
"goravel/app/http/trans"
|
||
"goravel/app/models"
|
||
)
|
||
|
||
// UserJwt C端用户JWT认证中间件(使用Goravel标准Auth)
|
||
func UserJwt() http.Middleware {
|
||
return func(ctx http.Context) {
|
||
// 如果路径是api/user前缀,使用user guard
|
||
path := ctx.Request().Path()
|
||
pathStr := str.Of(path)
|
||
if pathStr.IsEmpty() || !pathStr.StartsWith("/api/user") {
|
||
ctx.Request().Next()
|
||
return
|
||
}
|
||
|
||
// 使用Goravel标准Auth解析token
|
||
if _, err := facades.Auth(ctx).Guard("user").Parse(ctx.Request().Header("Authorization", "")); err != nil {
|
||
// 如果Header中没有token,尝试从URL参数中获取
|
||
if token := ctx.Request().Query("_token", ""); token != "" {
|
||
if _, err := facades.Auth(ctx).Guard("user").Parse(token); err != nil {
|
||
_ = ctx.Response().Json(http.StatusUnauthorized, http.Json{
|
||
"code": http.StatusUnauthorized,
|
||
"message": trans.Get(ctx, "invalid_token"),
|
||
}).Abort()
|
||
return
|
||
}
|
||
} else {
|
||
_ = ctx.Response().Json(http.StatusUnauthorized, http.Json{
|
||
"code": http.StatusUnauthorized,
|
||
"message": trans.Get(ctx, "not_logged_in"),
|
||
}).Abort()
|
||
return
|
||
}
|
||
}
|
||
|
||
// 获取用户信息
|
||
var user models.User
|
||
if err := facades.Auth(ctx).Guard("user").User(&user); err != nil {
|
||
_ = ctx.Response().Json(http.StatusUnauthorized, http.Json{
|
||
"code": http.StatusUnauthorized,
|
||
"message": trans.Get(ctx, "user_not_found"),
|
||
}).Abort()
|
||
return
|
||
}
|
||
|
||
if user.ID == 0 {
|
||
_ = ctx.Response().Json(http.StatusUnauthorized, http.Json{
|
||
"code": http.StatusUnauthorized,
|
||
"message": trans.Get(ctx, "user_not_found"),
|
||
}).Abort()
|
||
return
|
||
}
|
||
|
||
// 检查用户状态
|
||
if user.Status == 0 {
|
||
_ = ctx.Response().Json(http.StatusForbidden, http.Json{
|
||
"code": http.StatusForbidden,
|
||
"message": trans.Get(ctx, "account_disabled"),
|
||
}).Abort()
|
||
return
|
||
}
|
||
|
||
// 将用户信息存储到context中,供后续中间件使用
|
||
ctx.WithValue("user", user)
|
||
|
||
ctx.Request().Next()
|
||
}
|
||
}
|