javascript - Node.js。如何限制未登录用户的页面访问?

标签 javascript angularjs node.js express

我正在尝试使用 token 创建一个过滤器,以限制 Node.js 0.10 上未登录用户的页面访问,我使用如下中间件:

app.all( "/product/*" , handler);
// won't match /product        <-- Important
// will match /product/cool
// will match /product/foov

从此页面:Express.js Middleware Tutorial ,没有结果,除了登录页面之外,我的所有页面都是私有(private)的,我希望,如果未登录的用户尝试访问某个私有(private)页面,他会被重定向到登录页面。该 token 在登录时完美工作。这是我的代码:

我的组件树

   server
       - routes
            - usuario.js
   server.js
   pages
       - privadas
            -inicio.html
            -mapa.html
            -menu.html
       - login.html

server.js

var app = express();
...     
var requiereLogin = require('./server/routes/usuario');        
app.all('/privadas/*', requiereLogin);
...

usuario.js

var express = require('express');
var router = express.Router();
...
router.use(function(req,res,next){

    console.log("filter...");

    var token = req.headers['auth-token'];

    jwt.verify(token, process.env.SECRET, function(err, decoded){
        if (err){
            res.redirect('/login');                
        } else {
            req.user_id = decoded.IDU;
            next();
        }
    })
});

app.config

app.config(function($routeProvider){
    $routeProvider
    .when("/", {
        templateUrl: "pages/login.html", 
        css: ["css/login.css"],
        controller: "loginCtrl",
        controllerAs: "vm"
    })
    .when("/privadas/mapa", {
        templateUrl: "pages/privadas/mapa.html",
        controller: "mapCtrl",
        controllerAs: "vm"
    })
    .when("/privadas/inicio", {
        templateUrl: "pages/privadas/inicio.html",
        controller: "inicioCtrl",
        controllerAs: "vm"
    })  
    .otherwise({redirectTo:'/'});

});

有什么想法吗?谢谢!

最佳答案

我会建议passport.js。 它需要解释和演练,因此我添加了文档的链接和一些基本示例来帮助您入门。它将允许您存储用户信息并使用该信息来限制对给定路由的访问

http://passportjs.org/docs

你的routes.js

app.all('/privadas/*',AuthHelpers.loginRequired, requiereLogin);



function loginRequired(req, res, next) {
  if (!req.session.passport || !req.session.passport.user)
    return res.status(401).json({status: 'Please log in'});
  return next();
}

你的passport.js

const passport = require('passport');
var models = require('../server/models/index');

passport.serializeUser((user, done) => {

  var session={
    user.user,
  }
  done(null, session);
});

passport.deserializeUser((user, done) => {
  models.users.findOne({
      where: {
        user:  user.user
      }
    }).then(function(user) {
      done(null, user);
  }).catch(function (err) {
    done(err, null);
  });
});

module.exports = passport;

在 App.js 中

const passport = require('./auth/local');
app.use(passport.passport.initialize());
app.use(passport.passport.session());

关于javascript - Node.js。如何限制未登录用户的页面访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766838/

相关文章:

javascript - 了解 hashchange 事件的执行顺序

javascript - 无法使用 Angular.js 和 PHP 获取文件参数值

Java,将纪元转换为毫秒

javascript - 如何使用 Angular 有条件地向元素添加属性? (不只是属性数据,整个属性)

mysql - 如何使用/Angular 从 MySQL 服务器查看 RowDataPacket?

javascript - 使用 Sequelize 将另一个表中的属性作为一个字段包含在内

javascript - 扩展错误 es6 类模块问题

javascript - 在显示 HTML 之前检查 JS 值是否存在

mongodb - 使用 nodejs 将非常大的记录集导入 MongoDB

node.js - 可能的范围问题