Express - 公共目录分为授权/未授权用户

时间:2014-10-19 10:21:57

标签: node.js angularjs express

我有一个用express.js编写的应用程序,我试图将此应用程序分为两部分:

  • 一个用于未经授权的用户(路由仅限于/ - 登录页面,/ 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,并且永远不会调用此路由..

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

// 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);
});

答案 1 :(得分:0)

请记住,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 / *',...) - 之前的修改将取代url,这条路线永远不会被调用..

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