指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

nuxt3之auth组件的使用:

1.需要登录的页面
<script setup lang="ts">
definePageMeta({
  middleware: "auth", // 没有对 auth 再进行配置
});
</script>
  
2.登录页面
<script setup lang="ts">
definePageMeta({
  middleware: "auth",
  auth: { //这是一个对当前使用 auth 中间件的一个配置,只对当前页面生效
    unauthenticatedOnly: true, // 说明 只有无登录的用户才能访问这个页面
    navigateAuthenticatedTo: "/account/profile", // 当已登录的用户再次访问这个页面的时候,跳转到 个人profile页面
  },
});
</script>
  
3.auth中间件
export default defineNuxtRouteMiddleware(async (to, from) => {
  if (process.server) return
  const { isLoggedIn } = useAuthUtils();

  const authConfig = to.meta.auth || {};
  const unauthenticatedOnly = authConfig.unauthenticatedOnly === true;
  const navigateAuthenticatedTo = authConfig.navigateAuthenticatedTo || '/';

  const isAuthPage = to.path.startsWith('/auth/');

  if (!isLoggedIn.value && !isAuthPage) {
    return navigateTo(`/auth/login?target=${to.fullPath}`);
  }else if (isLoggedIn.value && unauthenticatedOnly) {
    return navigateTo(navigateAuthenticatedTo);
  }
})
  
如果不想这么细粒度的控制登录的话,直接处理target情况就可以了
export default defineNuxtRouteMiddleware(async (to, from) => {
  if (process.server) return
  const { isLoggedIn } = useAuthUtils();
  const isAuthPage = to.path.startsWith('/auth/');
  if (!isLoggedIn.value && !isAuthPage) {
    return navigateTo(`/auth/login?target=${to.fullPath}`);
  }
})
  
再次改进版本:
export default defineNuxtRouteMiddleware(async (to) => {
  if (import.meta.server) return;
  const { isLoggedIn } = useAuthUtils();
  const isAuthPage = to.path.startsWith("/auth/");
  if (!isLoggedIn.value && !isAuthPage) {
    return navigateTo(`/auth/login?target=${to.fullPath}`, { 
      replace: true,
      external: true
    });
  }
});
  
改进原因:  
当用户试图访问需要认证的页面(target 页面)时,系统会将他们重定向到登录页面。然而,如果不进行特殊处理,登录页面会继承目标页面的布局,导致登录页面的显示出现问题。这个是实际开发中遇到的问题.
navigateTo象包含两个属性:
replace: true:这会使用新的 URL 替换当前的历史记录条目,而不是添加一个新的。
external: true:这告诉 Nuxt 将导航视为外部导航,这将导致页面刷新。
  
4. to.path和 to.fullPath 区别
to.path 和 to.fullPath 是 Vue Router 中两个不同的属性,它们提供了关于目标路由的不同信息
  
to.path:
只包含 URL 的路径部分。
不包含查询参数和哈希。
例如,对于 URL "/users/profile?id=123#info",to.path 将只返回 "/users/profile"。
  
to.fullPath:
包含完整的 URL,包括路径、查询参数和哈希。
是 URL 的完整表示,不包括域名和协议。
对于上面的例子,to.fullPath 将返回 "/users/profile?id=123#info"。
  
区别总结:
path 只关注 URL 的路径部分。
fullPath 包含路径、查询参数和哈希
  
使用场景:
  
使用 to.path 的情况:
当您只需要知道页面的基本路径时。
在不关心查询参数和哈希的情况下进行路由匹配。
  
使用 to.fullPath 的情况:
当您需要完整的 URL 信息,包括查询参数和哈希。
在需要保留所有 URL 信息进行重定向时。