【问题标题】:Express - public directory divided for authorized/unauthorized usersExpress - 为授权/未授权用户划分的公共目录
【发布时间】:2014-10-19 10:21:56
【问题描述】:

我有一个用 express.js 编写的应用程序,我正在尝试将此应用程序分为 2 个部分:

  • 一个用于未经授权的用户(仅路由到 / - 登录页面、/login 和 /* - error404)
  • 第二个(路由将是:/ - 登录页面,/app/* - 将自行处理路由的角度 SPA)

Express 还配置为从/unauth/public/ 获取静态文件 我想为来自授权路由的请求添加第二个静态文件夹 - /auth/public 转到 /app/*

我的路线配置如下所示:

var authRoutes = express.Router();
var unauthRoutes = express.Router();

authRoutes.get('/app/*', function(req, res, next) {
    if(!req.isAuthenticated())
        return res.redirect("/login/");
    res.send("AUTHORIZED");
});

unauthRoutes.get('/', function(req, res, next) {
    res.send("LANDING PAGE");
});

unauthRoutes.get('/login/', function(req, res, next) {
    if(req.isAuthenticated())
        return res.redirect("/app/");
    res.send("LOGIN PAGE");
});

unauthRoutes.get('/registration/', function(req, res, next) {
    if(req.isAuthenticated())
        return res.redirect("/app/");
    res.send("REGISTRATION PAGE");
});

unauthRoutes.get('/*', function(req, res, next) {
    res.send("ERROR 404");
});

app.use('/', authRoutes);
app.use('/', unauthRoutes);

我尝试修改 req.url 并基于此调用另一个静态 oruter express.static('auth/public')

Using express.static middleware in an authorized route

但我不知道,如何处理路由app.get('/auth/*', ...) - 之前的修改将替换 url,并且永远不会调用此路由..

【问题讨论】:

    标签: node.js angularjs express


    【解决方案1】:

    你可以试试这样的:

    // Create your static middlewares
    var unauthStatic = express.static('unauth/public');
    var authStatic = express.static('auth/public');
    
    // This goes in place of where you would normally load your static middleware
    app.use(function(req, res, next) {
        if (req.isAuthenticated()) {
            authStatic(req, res, next);
        } else {
            unauthStatic(req, res, next);
        }
    });
    

    编辑:

    如果您希望经过身份验证的用户能够同时访问 auth 和 unauth 目录中的文件,您可以对 app.use 进行两次调用,如下所示:

    app.use(unauthStatic);
    app.use(function(req, res, next) {
        if (! req.isAuthenticated()) {
            return next();
        }
        authStatic(req, res, next);
    });
    

    【讨论】:

      【解决方案2】:

      请记住,express 在堆栈中使用中间件,这意味着为给定请求提供服务,所有注册的中间件都按照used 的顺序使用。一旦有一点中间件调用 req.send,就不会再执行中间件了。无论如何,尝试这样的事情:

      function Authorization(req, res, next) {
          if(!req.isAuthenticated())
              return res.redirect("/login");
          next();
      }
      
      var AnonRouter = express.Router()
          // GET /style.css will request /unauth/public/style.css
          .use(express.static('unauth/public'))
          .get('/', function (req, res) { })
          .get('/login', function (req, res) { });
      
      var AuthRouter = express.Router()
          .use(Authorization)
          // GET /app/style.css will request /auth/public/style.css
          .use(express.static('auth/public')) 
          .get('*', function (req, res, next) {
             // Handle reqs for non-static files
          });
      
      app.use('/', AnonRouter);
      app.use('/app', AuthRouter);
      app.get('*', function (req, res) {
          res.status(404).send('404!');
      });
      

      但我不知道,如何处理路由 app.get('/auth/*', ...) - 之前的修改将替换 url,并且永远不会调用此路由..

      这句话让我觉得你试图以某种方式处理请求 express 的静态中间件被调用之后。这是不可能的:静态中间件服务于静态文件,在它执行之后你不能执行额外的逻辑,但你可以在之前运行东西!请注意,在我的代码中,授权中间件将在发送静态文件之前运行。

      【讨论】:

        猜你喜欢
        • 2019-04-06
        • 2019-04-11
        • 2021-10-23
        • 2014-06-20
        • 1970-01-01
        • 2013-11-01
        • 2022-08-19
        • 2019-03-07
        • 2016-12-17
        相关资源
        最近更新 更多