繁体   English   中英

如何将用户重定向到登录页面

[英]how to redirect user to login page with

我有一个 NodeJS 后端服务,我使用http-proxy-middleware库来配置代理,并根据也在 kubernetes 中运行的用户类型将用户重定向到相关的前端服务。

假设https://example.com是我的根地址。 当用户输入此 URL 时,他/她重定向登录页面,然后根据用户类型路由到相关前端。 登录后,用户可以通过https://example.com/docs/employees访问内容。 但是,如果他/她在没有登录的情况下复制并粘贴https://example.com/docs/employees URL,那么我会抛出如下错误“需要登录”。 但我也想自动将用户重定向到登录页面。

我怎样才能做到这一点?

我尝试使用自定义中间件并使用类似router.get("/", isAuth)但对我不起作用。当我尝试在代理中return res.redirect("/redirect/oidcLogin")时出现循环.

module.exports = (req, res, next) => {
    if (!req.session.isLoggedIn && !req.session.userinfo) {
        return res.redirect("/redirect/oidcLogin");
    }
    next();
}

路由器

router.get("/", (req, res) => {
  if (req.session && req.session.userinfo && req.session.isLoggedIn) {
    return res.redirect("/docs");
  } else {
    return res.redirect("/redirect/oidcLogin");
  }
});

router.get("/redirect/oidcLogin", authController.redirectOidc);
router.get("/auth/login/callback", authController.callbackLogin);
router.get("/redirect/oidcLogout", authController.logOut);
module.exports = router;

应用程序.js

const userTypeRouter = function (req) {
      if (
        !req.session ||
        !req.session.userinfo ||
        !req.session.userinfo.communities ||
        !req.session.isLoggedIn
      ) {
        const err = new Error("Please login");
        err.statusCode = 403;
        throw err;
      }
      let isUser1 = true;
      if (req.session.userinfo.communities.includes("EMPLOYEE")) {
        isUser1 = false;
      }
      if (isDealer) {
        return "http://user1.svc.cluster.local";
      } else {
        return "http://user2.svc.cluster.local";
      }
    };
    
    const options = {
      router: userTypeRouter,
      pathRewrite: {
        ["^/docs"]: "/",
      },
      changeOrigin: true,
      ws: true,
    };
    const proxy = createProxyMiddleware(options);
    
    app.use(authRoutes);
    app.use("/docs", proxy);
    app.use(
      "/employees",
      createProxyMiddleware({
        router: userTypeRouter,
        pathRewrite: {
          "^/employees": "/",
        },
        changeOrigin: true,
        ws: true,
      })
    );
    app.use(
      "/dealers",
      createProxyMiddleware({
        router: userTypeRouter,
        pathRewrite: {
          "^/dealers": "/",
        },
        changeOrigin: true,
        ws: true,
      })
    );
    
    app.use((error, req, res, next) => {
      console.log(error);
      const status = error.statusCode;
      if (status === 403) {
        res.status(status).send("Login required");
      } else {
        res.send(error.message);
      }
    });

理想情况下,您应该为生产模式设置会话存储,以便如果您的服务器离线或使用多个服务器,您与用户的会话将被包含在内,并且他们可以基于密钥系统保持在线。

另一方面, res.redirect("/redirect/oidcLogin") 应该将您带到 yoursite.com/redirect/oidcLogin

如果你说你被困在一个循环中,这可能是在 oidcLogin 的 GET 上的原因,有一个检查失败。

代码对我来说不够响亮,但建议是简化......您只需要为 session 设置 isvalidated 并在用户验证您的标准时将其定义为 true。

WEBAPP.post('/login', LoginLimiter, (req, res) => {
    if (req.session.loggedin) return res.redirect("/");
// Not logged in so let's run our code/and render the page.
});

这确实是一个需求,当用户匹配 100% 注册或登录时,loginin 被设置为 true。

下面为我工作

app.use(
  "/employees",
    isAuth,
  createProxyMiddleware({
    router: userTypeRouter,
    pathRewrite: {
      "^/employees": "/",
    },
    changeOrigin: true,
    ws: true,
  })
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM