2015-11-01 86 views
0

我见过很多关于如何将认证中间件添加到需要限制登录用户的某些路由(意味着默认设置允许任何人访问页面)的示例,但我不知道如何默认情况下使所有路由都需要登录,并有选择地选择匿名用户可以访问的路由。如何让Express路由默认需要身份验证?

任何方式使它像这样工作?我正在使用Express 4.

回答

0

我会使用:https://github.com/expressjs/session一旦用户通过身份验证,您就可以检查控制器中处理express的路由的有效会话。

更新回答

这是我会怎么做,控制用户登录

/** 
* Module dependencies 
*/ 

var express = require('express'), 
    http = require('http'), 
    session = require('express-session'), 
    app = module.exports = express(); 

/** 
* Configuration 
*/ 

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('trust proxy', 1); 
app.use(session({ 
    secret: 'keyboard cat', 
    resave: false, 
    saveUninitialized: true, 
    cookie: { 
    secure: true 
    } 
})); 


function checkUserLoggedIn(req, res, next) { 
    return req.session; 
} 
/** 
* Routes to control by default is logged in with a regular expression 
*/ 
app.get('/user/:use_id/*', function (req, res, next) { 
    if (checkUserLoggedIn(req)) { 
    console.log('User logged'); 
    next(); 
    } else { 
    console.log('error'); 
    } 
}); 
/** 
* User Home 
*/ 
app.get('/user/:use_id/home/', function (req, res, next) { 
    if (checkUserLoggedIn(req)) { 
    console.log('User logged goes to home'); 
    next(); 
    } else { 
    console.log('error'); 
    } 
}); 


/** 
* Home for user that is actually logged 
*/ 
app.get('/guest/dashboard', function (req, res, next) { 
    console.log('This is guest dashboard'); 
}); 

/** 
* Home for user that is actually logged 
*/ 
app.get('/guest/home', function (req, res, next) { 
    console.log('This is guest home'); 
}); 


/** 
* Start Server 
*/ 
http.createServer(app).listen(app.get('port'), function() { 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

然后运行

$节点app.js

往浏览器和访问http://localhost:3000/home

您在控制'/ *'中定义的正则表达式获取所有默认路由,然后转到匹配的下一个路由,即/ home。

这是一种方法,可能有更好更清晰的方法来解决问题。在正则表达式中,您可以控制默认路由和每个特定情况的含义。

+0

看来这情况与此类似: http://stackoverflow.com/questions/18739725/how-to-know-if-user-is-logged-in-with-passport-js 在最后你不需要cujojs/meld,因为它是在这个相关的问题中解释的。 –

+0

但是你写的这个中间件放在需要被保护的路由上吗?我在询问如何使默认设置要求所有路由得到保护,并且只为那些不需要保护的路由设置例外。 – user779159

+0

我添加了一些示例代码,您可以控制所有路由的默认值,您可以使用reg exp定义自己的默认条件。会话控制非常简单,但您也可以在这种情况下放置所需的标准。 –