5

我想在Flatiron堆栈中实现身份验证和授权(使用 Flatiron、Resourceful 和 Restful)。在尝试更改资源时,我想要求用户具有必要的权限。在 Restful 自述文件中,有一条关于授权的说明

有几种方法可以为访问用 restful 公开的资源方法提供安全性和授权。推荐的授权模式是使用资源丰富的 forbeforeafterhooks 能力。在这些钩子中,您可以添加额外的业务逻辑来限制对资源方法的访问。

不建议授权逻辑放置在路由层中,因为在理想情况下,路由器将是资源的反射接口。理论上,路由器本身的安全性应该是无关紧要的,因为资源可能有多个反射接口,它们都需要相同的业务逻辑。

TL;博士; 为了安全和授权,你应该使用足智多谋的 beforeafter钩子。

所以授权可以通过 Resourceful 的 hooking 系统来处理。

我的实际问题是每个 HTTP 请求开始时的身份验证过程。

假设我有一个资源Post,一个User和一个资源Session。REST API 是使用 Restful 定义的。我对这个问题的主要关注是确保用户在创建帖子时有会话。其他方法,如saveupdate或其他资源,如创建用户,应该类似地工作。

文件app.js

var flatiron = require('flatiron');
var app = flatiron.app;

app.resources = require('./resources.js');

app.use(flatiron.plugins.http);
app.use(restful);
app.start(8080, function(){
  console.log('http server started on port 8080');
});

文件resources.js

var resourceful = require('resourceful');

var resources = exports;

resources.User = resourceful.define('user', function() {
  this.restful = true;
  this.string('name');
  this.string('password');
});

resources.Session = resourceful.define('session', function() {
  // note: this is not restful
  this.use('memory');
  this.string('session_id');
});

resources.Post = resourceful.define('post', function() {
  this.restful = true;
  this.use('memory');
  this.string('title');
  this.string('content');
});

resources.Post.before('create', function authorization(post, callback) {
  // What should happen here?
  // How do I ensure, a user has a session id?

  callback();
});

还有一个可运行的代码版本(感谢@generalhenry)。

所以假设一个用户试图创建一个帖子,已经被赋予了一个会话 id,这个会话 ID 是随着他通过 cookie 标头发出的每个请求而发送的。如何在 before 钩子(即authorization回调)中访问该 cookie?

该示例可以从 开始,node app.jsHTTP 请求可以使用curl.

4

1 回答 1

4

请记住,这些指南适用于授权过程。如果您需要使用 sessionId,您可以通过任何一种方式访问​​它:req.sessionID, req.cookies["connect.sid"].

通过这种方式检查请求,您将确保每个用户都有有效的会话 ID。

app.use(flatiron.plugins.http, {
  before: [
    connect.favicon(),
    connect.cookieParser('catpsy speeds'),
    function(req, res) {
      if (req.originalUrl === undefined) {
        req.originalUrl = req.url;
      }
      res.emit('next');
    },
    connect.session({secret : 'secter'}),
    function(req, res) {
      console.log('Authenticating...');
      console.dir(req.session);
      //any other validation logic
      if (req.url !== '/login' && typeof req.session.user == 'undefined') {
        res.redirect('/login');
      } else {
        res.emit('next');
      }
    }
  ]
});

这是使用这种方法的项目示例。

于 2013-03-23T20:02:44.840 回答