Auth guard

This commit is contained in:
LittleSheep 2024-03-13 23:33:29 +08:00
parent 5a966a42d7
commit f0e24f634b
2 changed files with 49 additions and 29 deletions

View File

@ -1,4 +1,5 @@
import { createRouter, createWebHistory } from "vue-router" import { createRouter, createWebHistory } from "vue-router"
import { useUserinfo } from "@/stores/userinfo"
import MasterLayout from "@/layouts/master.vue" import MasterLayout from "@/layouts/master.vue"
const router = createRouter({ const router = createRouter({
@ -7,18 +8,39 @@ const router = createRouter({
{ {
path: "/", path: "/",
component: MasterLayout, component: MasterLayout,
children: [ children: [{ path: "/", name: "dashboard", component: () => import("@/views/dashboard.vue") }],
{ path: "/", name: "dashboard", component: () => import("@/views/dashboard.vue") },
],
}, },
{ {
path: "/auth", path: "/auth",
children: [ children: [
{ path: "sign-in", name: "auth.sign-in", component: () => import("@/views/auth/sign-in.vue") }, {
{ path: "sign-up", name: "auth.sign-up", component: () => import("@/views/auth/sign-up.vue") }, path: "sign-in",
] name: "auth.sign-in",
} component: () => import("@/views/auth/sign-in.vue"),
meta: { public: true },
},
{
path: "sign-up",
name: "auth.sign-up",
component: () => import("@/views/auth/sign-up.vue"),
meta: { public: true },
},
],
},
], ],
}) })
router.beforeEach(async (to, from, next) => {
const id = useUserinfo()
if (!id.isReady) {
await id.readProfiles()
}
if (!to.meta.public && !id.userinfo.isLoggedIn) {
next({ name: "auth.sign-in", query: { redirect_uri: to.fullPath } })
} else {
next()
}
})
export default router export default router

View File

@ -4,17 +4,15 @@ import { ref } from "vue"
import { request } from "@/scripts/request" import { request } from "@/scripts/request"
export interface Userinfo { export interface Userinfo {
isReady: boolean
isLoggedIn: boolean isLoggedIn: boolean
displayName: string displayName: string
data: any data: any
} }
const defaultUserinfo: Userinfo = { const defaultUserinfo: Userinfo = {
isReady: false,
isLoggedIn: false, isLoggedIn: false,
displayName: "Citizen", displayName: "Citizen",
data: null data: null,
} }
export function getAtk(): string { export function getAtk(): string {
@ -31,25 +29,25 @@ export const useUserinfo = defineStore("userinfo", () => {
async function readProfiles() { async function readProfiles() {
if (!checkLoggedIn()) { if (!checkLoggedIn()) {
isReady.value = true; isReady.value = true
} }
const res = await request("/api/users/me", { const res = await request("/api/users/me", {
headers: { "Authorization": `Bearer ${getAtk()}` } headers: { Authorization: `Bearer ${getAtk()}` },
}); })
if (res.status !== 200) { if (res.status !== 200) {
return; return
} }
const data = await res.json(); const data = await res.json()
userinfo.value = { isReady.value = true
isReady: true, userinfo.value = {
isLoggedIn: true, isLoggedIn: true,
displayName: data["nick"], displayName: data["nick"],
data: data data: data,
}; }
} }
return { userinfo, isReady, readProfiles } return { userinfo, isReady, readProfiles }