快车 - 公共目录分为授权/未经授权的用户

快车 - 公共目录分为授权/未经授权的用户

问题描述:

我有一个应用程序写在express.js,我想这个应用程序划分为2个部分:快车 - 公共目录分为授权/未经授权的用户

  • 一个未经授权的用户(与路线只/ - 着陆页/登录和/ * - error404)
  • 和第二(路线将是:/ - 着陆页/应用/ * - 角SPA将处理它自己的路由)

快递还配置为从/unauth/public/ A获取静态文件第二我想从授权的路由添加第二个静态文件夹的请求 - /auth/public 都到/应用/ *

我的路线的配置是这样的:

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和这条路线将永远不会被调用..

你可以尝试这样的事:

// 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访问文件和未授权的目录,就可以使两个调用app.use,像这样:

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

记住Express使用中间件堆栈,这意味着服务于给定的请求,所有注册的中间件按照use d的顺序使用。一旦中间件调用了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/*',...) - 先前的修改将更换网址,这路线将永远不会被调用..

这种说法让我觉得,你是试图以某种方式处理快递的静态中间件被称为后的请求。这是不可能的:静态中间件提供静态文件,你不能在执行后执行其他逻辑,但你可以在之前运行一些东西!请注意,在我的代码中,授权中间件将在发送静态文件之前运行。