feat(auth): add admin authentication with permission checks

- Add admin login handler and logic with IsAdmin verification
- Add admin password reset handler and logic
- Add admin captcha generation handler and logic
- Implement device binding for admin login
- Add login logging for admin authentication
- Check EnableAdminLoginCaptcha configuration
- Separate admin authentication from user authentication
- Verify admin permission before allowing access
This commit is contained in:
EUForest
2026-03-09 22:54:59 +08:00
parent 2afb86f973
commit 9aaffec61d
6 changed files with 577 additions and 0 deletions
@@ -0,0 +1,18 @@
package admin
import (
"github.com/gin-gonic/gin"
"github.com/perfect-panel/server/internal/logic/auth/admin"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/pkg/result"
)
// Generate captcha
func AdminGenerateCaptchaHandler(svcCtx *svc.ServiceContext) func(c *gin.Context) {
return func(c *gin.Context) {
l := admin.NewAdminGenerateCaptchaLogic(c.Request.Context(), svcCtx)
resp, err := l.AdminGenerateCaptcha()
result.HttpResult(c, resp, err)
}
}
@@ -0,0 +1,30 @@
package admin
import (
"github.com/gin-gonic/gin"
adminLogic "github.com/perfect-panel/server/internal/logic/auth/admin"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/internal/types"
"github.com/perfect-panel/server/pkg/result"
)
// Admin login
func AdminLoginHandler(svcCtx *svc.ServiceContext) func(c *gin.Context) {
return func(c *gin.Context) {
var req types.UserLoginRequest
_ = c.ShouldBind(&req)
// get client ip
req.IP = c.ClientIP()
req.UserAgent = c.Request.UserAgent()
validateErr := svcCtx.Validate(&req)
if validateErr != nil {
result.ParamErrorResult(c, validateErr)
return
}
l := adminLogic.NewAdminLoginLogic(c.Request.Context(), svcCtx)
resp, err := l.AdminLogin(&req)
result.HttpResult(c, resp, err)
}
}
@@ -0,0 +1,29 @@
package admin
import (
"github.com/gin-gonic/gin"
adminLogic "github.com/perfect-panel/server/internal/logic/auth/admin"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/internal/types"
"github.com/perfect-panel/server/pkg/result"
)
// Admin reset password
func AdminResetPasswordHandler(svcCtx *svc.ServiceContext) func(c *gin.Context) {
return func(c *gin.Context) {
var req types.ResetPasswordRequest
_ = c.ShouldBind(&req)
validateErr := svcCtx.Validate(&req)
if validateErr != nil {
result.ParamErrorResult(c, validateErr)
return
}
// get client ip
req.IP = c.ClientIP()
req.UserAgent = c.Request.UserAgent()
l := adminLogic.NewAdminResetPasswordLogic(c.Request.Context(), svcCtx)
resp, err := l.AdminResetPassword(&req)
result.HttpResult(c, resp, err)
}
}