authentication和授权与Flatiron的丰富&Restful

我想在Flatiron栈中实现authentication和授权(使用Flatiron,Resourceful和Restful)。 我想要求用户在尝试更改资源时拥有必要的权限。 在Restful自述文件中,有一个关于授权的说明 :

有几种方法可以提供安全性和授权来访问以restful暴露的资源方法。 推荐的授权模式是在使用hook beforeafter使用足智多谋的能力。 在这些钩子中,可以添加额外的业务逻辑来限制对资源方法的访问。

build议将授权逻辑放置在路由层中,因为在理想的情况下,路由器将成为资源的reflection接口。 从理论上讲,路由器本身的安全性应该有点不相关,因为资源可能有多个reflection接口,都需要相同的业务逻辑。

TL; DR; 为了安全和授权,你应该使用before资源。

所以授权可以由Resourceful的挂钩系统来处理。

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

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

文件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)。

所以假设一个用户试图创build一个post,已经被给了一个会话ID,这是与他通过cookie头做出的每个请求一起发送的。 我怎样才能访问前钩(即authorizationcallback)的cookie?

这个例子可以使用node app.js来启动,HTTP请求可以使用curl

请记住,这些准则适用于授权过程。 如果您需要使用sessionId,则可以通过以下方式访问它: req.sessionIDreq.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'); } } ] }); 

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