From 92a070cc815a1b4635882ac6f3cc19ad952b2533 Mon Sep 17 00:00:00 2001 From: yanghao05 Date: Wed, 16 Apr 2025 20:26:02 +0800 Subject: [PATCH] feat: add admin auth middleware --- backend/app/http/admin/auth.go | 12 ++++++++---- backend/app/middlewares/mid_auth.go | 12 ++++++++++++ frontend/admin/src/api/httpClient.js | 10 +++++----- frontend/admin/src/pages/LoginPage.vue | 7 ++++++- frontend/admin/src/stores/auth.js | 6 +++--- 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/backend/app/http/admin/auth.go b/backend/app/http/admin/auth.go index 7ee719b..b1073b2 100644 --- a/backend/app/http/admin/auth.go +++ b/backend/app/http/admin/auth.go @@ -16,10 +16,14 @@ type AuthBody struct { Password string `json:"password" validate:"required"` } +type TokenResponse struct { + Token string `json:"token"` +} + // Login // @Router /v1/admin/auth [post] // @Bind body body -func (ctl *auth) Login(ctx fiber.Ctx, body *AuthBody) (string, error) { +func (ctl *auth) Login(ctx fiber.Ctx, body *AuthBody) (*TokenResponse, error) { if body.Username == "admin" && body.Password == "xixi@0202" { claim := ctl.jwt.CreateClaims(jwt.BaseClaims{ UserID: 1, @@ -27,9 +31,9 @@ func (ctl *auth) Login(ctx fiber.Ctx, body *AuthBody) (string, error) { token, err := ctl.jwt.CreateToken(claim) if err != nil { - return "", err + return nil, err } - return token, nil + return &TokenResponse{Token: token}, nil } - return "", fiber.ErrUnauthorized + return nil, fiber.ErrUnauthorized } diff --git a/backend/app/middlewares/mid_auth.go b/backend/app/middlewares/mid_auth.go index 987af1e..a7f07bd 100644 --- a/backend/app/middlewares/mid_auth.go +++ b/backend/app/middlewares/mid_auth.go @@ -16,6 +16,18 @@ func (f *Middlewares) Auth(ctx fiber.Ctx) error { } if strings.HasPrefix(ctx.Path(), "/v1/admin/") { + token := ctx.Get("Authorization") + if token == "" { + return ctx.Status(fiber.StatusUnauthorized).SendString("Unauthorized") + } + jwt, err := f.jwt.Parse(token) + if err != nil { + return ctx.Status(fiber.StatusUnauthorized).SendString("Unauthorized") + } + if jwt.UserID != 1 { + return ctx.Status(fiber.StatusForbidden).SendString("Forbidden") + } + return ctx.Next() } diff --git a/frontend/admin/src/api/httpClient.js b/frontend/admin/src/api/httpClient.js index 2545fb6..985d69b 100644 --- a/frontend/admin/src/api/httpClient.js +++ b/frontend/admin/src/api/httpClient.js @@ -1,3 +1,4 @@ +import { useAuthStore } from '@/stores/auth'; import axios from 'axios'; // Create axios instance with default config @@ -12,11 +13,10 @@ const httpClient = axios.create({ // Request interceptor httpClient.interceptors.request.use( config => { - // You can add auth token here if needed - // const token = localStorage.getItem('token'); - // if (token) { - // config.headers.Authorization = `Bearer ${token}`; - // } + const authStore = useAuthStore(); + if (authStore.isAuthenticated && authStore.token) { + config.headers.Authorization = `Bearer ${authStore.token}`; + } return config; }, error => { diff --git a/frontend/admin/src/pages/LoginPage.vue b/frontend/admin/src/pages/LoginPage.vue index 921446f..6743aee 100644 --- a/frontend/admin/src/pages/LoginPage.vue +++ b/frontend/admin/src/pages/LoginPage.vue @@ -25,6 +25,10 @@ const validateForm = () => { errorMessage.value = '请输入密码'; return false; } + if (password.value.length < 8) { + errorMessage.value = '密码至少需要8个字符'; + return false; + } return true; }; @@ -35,7 +39,8 @@ const handleLogin = async () => { errorMessage.value = ''; try { - const token = await authService.login(username.value, password.value); + const resp = await authService.login(username.value, password.value); + const { token } = resp.data; authStore.setToken(token); router.push('/'); } catch (error) { diff --git a/frontend/admin/src/stores/auth.js b/frontend/admin/src/stores/auth.js index 07a40b0..64a2baa 100644 --- a/frontend/admin/src/stores/auth.js +++ b/frontend/admin/src/stores/auth.js @@ -2,21 +2,21 @@ import { defineStore } from 'pinia'; import { computed, ref } from 'vue'; export const useAuthStore = defineStore('auth', () => { - const token = ref(localStorage.getItem('token')); + const token = ref(localStorage.getItem('__token')); const user = ref(null); const isAuthenticated = computed(() => !!token.value); function setToken(newToken) { token.value = newToken; - localStorage.setItem('token', newToken); + localStorage.setItem('__token', newToken); } function logout() { token.value = null; user.value = null; - localStorage.removeItem('token'); + localStorage.removeItem('__token'); } return {