学习笔记-WEB-全栈框架Nextjs之中间件

基本使用

中间件可以按照matcher去匹配可以生效的文件路径,中断api调用或静态文件。

在src根目录定义中间件middleware.js

(个人理解:next-auth是将各种认证的函数通过callback的形式定义,并最终转化成api路径下的实际router,也就是说NextAuth所暴露的auth/signIn/signOut只是调用框架的必要接口,而实际的功能都是在callback api中实现的)

创建authConfig配置文件

该文件需要和authjs中的配置文件进行合并(略)才能让callback真正生效,authorized:此回调在用户需要授权时被调用,通常在使用中间件时。你可以通过返回自定义响应来覆盖默认行为。

为auth增加用户信息以完善跳转逻辑

在jwt回调中为token丰富用户信息

在session回调中通过token增加session信息

在authorized中判断是否可以通过认证,如果未通过认证则跳转至login

export const authConfig = {
  pages: {
    signIn: "/login",
  },
  providers: [],
  callbacks: {
    // FOR MORE DETAIL ABOUT CALLBACK FUNCTIONS CHECK https://next-auth.js.org/configuration/callbacks
    async jwt({ token, user }) {
      if (user) {
        token.id = user.id;
        token.isAdmin = user.isAdmin;
      }
      return token;
    },
    async session({ session, token }) {
      if (token) {
        session.user.id = token.id;
        session.user.isAdmin = token.isAdmin;
      }
      return session;
    },
    authorized({ auth, request }) {
      const user = auth?.user;
      const isOnAdminPanel = request.nextUrl?.pathname.startsWith("/admin");
      const isOnBlogPage = request.nextUrl?.pathname.startsWith("/blog");
      const isOnLoginPage = request.nextUrl?.pathname.startsWith("/login");

      // ONLY ADMIN CAN REACH THE ADMIN DASHBOARD

      if (isOnAdminPanel && !user?.isAdmin) {
        return false;
      }

      // ONLY AUTHENTICATED USERS CAN REACH THE BLOG PAGE

      if (isOnBlogPage && !user) {
        return false;
      }

      // ONLY UNAUTHENTICATED USERS CAN REACH THE LOGIN PAGE

      if (isOnLoginPage && user) {
        return Response.redirect(new URL("/", request.nextUrl));
      }

      return true
    },
  },
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值