rbac
This commit is contained in:
@@ -2,24 +2,21 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"portal-mini-go/internal/middleware"
|
||||
"portal-mini-go/internal/pkg/errors"
|
||||
"portal-mini-go/internal/pkg/response"
|
||||
"portal-mini-go/internal/pkg/token"
|
||||
authsvc "portal-mini-go/internal/service/admin/auth"
|
||||
)
|
||||
|
||||
// Handler 后台请求处理。
|
||||
type Handler struct {
|
||||
jwtSecret string
|
||||
tokenTTL time.Duration
|
||||
authSvc *authsvc.Service
|
||||
}
|
||||
|
||||
func NewHandler(jwtSecret string, tokenTTL time.Duration) *Handler {
|
||||
return &Handler{jwtSecret: jwtSecret, tokenTTL: tokenTTL}
|
||||
func NewHandler(authSvc *authsvc.Service) *Handler {
|
||||
return &Handler{authSvc: authSvc}
|
||||
}
|
||||
|
||||
type LoginReq struct {
|
||||
@@ -27,32 +24,42 @@ type LoginReq struct {
|
||||
Password string `json:"password" binding:"required"`
|
||||
}
|
||||
|
||||
// Login 后台登录(示例固定账号,生产应接 DB + 密码哈希校验)。
|
||||
// Login 后台登录:校验账号密码后签发 JWT。
|
||||
func (h *Handler) Login(c *gin.Context) {
|
||||
var req LoginReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.Error(errors.ErrBadRequest)
|
||||
return
|
||||
}
|
||||
if req.Username != "admin" || req.Password != "admin123" {
|
||||
c.Error(errors.ErrUnauthorized)
|
||||
return
|
||||
}
|
||||
t, err := token.Generate(h.jwtSecret, "1", h.tokenTTL)
|
||||
t, err := h.authSvc.Login(c.Request.Context(), authsvc.LoginReq{Username: req.Username, Password: req.Password})
|
||||
if err != nil {
|
||||
c.Error(errors.Wrap(50000, "gen token", err))
|
||||
c.Error(err)
|
||||
return
|
||||
}
|
||||
response.OK(c, gin.H{"token": t})
|
||||
}
|
||||
|
||||
// Info 受保护接口示例,需携带有效 Bearer token。
|
||||
// Info 受保护接口:返回当前管理员的角色、权限与可见菜单树。
|
||||
func (h *Handler) Info(c *gin.Context) {
|
||||
response.OK(c, gin.H{"admin_id": middleware.AdminID(c)})
|
||||
id, ok := middleware.AdminIDUint(c)
|
||||
if !ok {
|
||||
c.Error(errors.ErrUnauthorized)
|
||||
return
|
||||
}
|
||||
info, err := h.authSvc.Info(c.Request.Context(), id)
|
||||
if err != nil {
|
||||
c.Error(err)
|
||||
return
|
||||
}
|
||||
response.OK(c, info)
|
||||
}
|
||||
|
||||
// Register 注册后台路由。g 已带 /api/admin 前缀与 JWT 鉴权中间件。
|
||||
// Register 注册后台鉴权后路由(当前为 /info)。g 已带 JWT 鉴权中间件。
|
||||
func Register(g *gin.RouterGroup, h *Handler) {
|
||||
g.POST("/login", h.Login)
|
||||
g.GET("/info", h.Info)
|
||||
}
|
||||
|
||||
// RegisterLogin 注册公开登录接口(不经过 JWT 鉴权),挂在 /api/admin 前缀下。
|
||||
func RegisterLogin(g *gin.RouterGroup, h *Handler) {
|
||||
g.POST("/login", h.Login)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user